try to push real mTasks to the client
[mTask.git] / miTask.icl
1 module miTask
2
3 import StdDebug, StdMisc
4
5 from Text import class Text(concat,join,split), instance Text String
6
7 import iTasks
8 import mTask
9
10 Start :: *World -> *World
11 Start world = startEngine mTaskTask world
12
13 mTaskTask :: Task ()
14 mTaskTask = withShared ([],False,[],False) (\ch->
15 syncNetworkChannel "localhost" 8123 "\n" id id ch ||-
16 sendByteCode ||-
17 updateSharedInformation "channels" [] ch @! ())
18
19 sendByteCode :: Task ()
20 sendByteCode = viewInformation "send" [] "4" @! ()
21 // (toReadableByteCode (unMain bc)) @! ()
22 where
23 bc :: Main (ByteCode Int Expr)
24 bc = sds \x=41 In
25 sds \y=1 In
26 {main = x =. x +. y}
27
28 syncNetworkChannel :: String Int String (String -> m) (m -> String) (Shared ([m],Bool,[m],Bool)) -> Task () | iTask m
29 syncNetworkChannel server port msgSeparator decodeFun encodeFun channel
30 = tcpconnect server port channel {ConnectionHandlers|onConnect=onConnect,whileConnected=whileConnected,onDisconnect=onDisconnect} @! ()
31 where
32 onConnect _ (received,receiveStopped,send,sendStopped)
33 = (Ok "",if (not (isEmpty send)) (Just (received,False,[],sendStopped)) Nothing, map encodeFun send,False)
34 whileConnected Nothing acc (received,receiveStopped,send,sendStopped)
35 = (Ok acc, Nothing, [], False)
36 whileConnected (Just newData) acc (received,receiveStopped,send,sendStopped)
37 # [acc:msgs] = reverse (split msgSeparator (concat [acc,newData]))
38 # write = if (not (isEmpty msgs && isEmpty send))
39 (Just (received ++ map decodeFun (reverse msgs),receiveStopped,[],sendStopped))
40 Nothing
41 = (Ok acc,write,map encodeFun send,False)
42
43 onDisconnect l (received,receiveStopped,send,sendStopped)
44 = (Ok l,Just (received,True,send,sendStopped))
45
46 consumeNetworkStream :: ([m] -> Task ()) (Shared ([m],Bool,[m],Bool)) -> Task () | iTask m
47 consumeNetworkStream processTask channel
48 = ((watch channel >>* [OnValue (ifValue ifProcess process)]) <! id) @! ()
49 where
50 ifProcess (received,receiveStopped,_,_)
51 = receiveStopped || (not (isEmpty received))
52
53 process (received,receiveStopped,_,_)
54 = upd empty channel
55 >>| if (isEmpty received) (return ()) (processTask received)
56 @! receiveStopped
57
58 empty :: ([m],Bool,[m],Bool) -> ([m],Bool,[m],Bool)
59 empty (_,rs,s,ss) = ([],rs,s,ss)