add publishing of sds's
[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 derive class iTask MTaskMessage
11
12 Start :: *World -> *World
13 Start world = startEngine (
14 enterInformation "Port Number?" []
15 >>= \port->withShared ([], False, [], False) (mTaskTask port)
16 ) world
17 //Start world = startEngine mTaskTask world
18
19 mTaskTask :: Int (Shared ([MTaskMessage],Bool,[MTaskMessage],Bool)) -> Task ()
20 mTaskTask port ch =
21 syncNetworkChannel "localhost" port "\n" decode encode ch ||-
22 (
23 sendMsg msgs ch >>= \_->
24 viewSharedInformation "channels" [ViewWith lens] ch @! ()
25 ) >>* [OnAction ActionFinish (always shutDown)]
26 where
27 lens :: ([MTaskMessage],Bool,[MTaskMessage],Bool) -> ([String], [String])
28 lens (r,_,s,_) = (f r, f s)
29 where
30 f [] = []
31 f [MTEmpty:xs] = f xs
32 f [x:xs] = [toString x:f xs]
33
34 msgs = toMessages 500 (toRealByteCode (unMain bc))
35
36 bc :: Main (ByteCode Int Stmt)
37 bc = sds \x=0 In {main = x =. x +. lit 1 :. pub x}
38
39 sendMsg :: [MTaskMessage] (Shared ([MTaskMessage],Bool,[MTaskMessage],Bool)) -> Task ()
40 sendMsg m ch = upd (\(r,rs,s,ss)->(r,rs,s ++ m,ss)) ch @! ()
41
42 syncNetworkChannel :: String Int String (String -> m) (n -> String) (Shared ([m],Bool,[n],Bool)) -> Task () | iTask m & iTask n
43 syncNetworkChannel server port msgSeparator decodeFun encodeFun channel
44 = tcpconnect server port channel {ConnectionHandlers|onConnect=onConnect,whileConnected=whileConnected,onDisconnect=onDisconnect} @! ()
45 where
46 onConnect _ (received,receiveStopped,send,sendStopped)
47 = (Ok "",if (not (isEmpty send)) (Just (received,False,[],sendStopped)) Nothing, map encodeFun send,False)
48 whileConnected Nothing acc (received,receiveStopped,send,sendStopped)
49 = (Ok acc, Nothing, [], False)
50 whileConnected (Just newData) acc (received,receiveStopped,send,sendStopped)
51 # [acc:msgs] = reverse (split msgSeparator (concat [acc,newData]))
52 # write = if (not (isEmpty msgs && isEmpty send))
53 (Just (received ++ map decodeFun (reverse msgs),receiveStopped,[],sendStopped))
54 Nothing
55 = (Ok acc,write,map encodeFun send,False)
56
57 onDisconnect l (received,receiveStopped,send,sendStopped)
58 = (Ok l,Just (received,True,send,sendStopped))
59
60 //consumeNetworkStream :: ([m] -> Task ()) (Shared ([m],Bool,[n],Bool)) -> Task () | iTask m & iTask n
61 //consumeNetworkStream processTask channel
62 // = ((watch channel >>* [OnValue (ifValue ifProcess process)]) <! id) @! ()
63 // where
64 // ifProcess (received,receiveStopped,_,_)
65 // = receiveStopped || (not (isEmpty received))
66 //
67 // process (received,receiveStopped,_,_)
68 // = upd empty channel
69 // >>| if (isEmpty received) (return ()) (processTask received)
70 // @! receiveStopped
71 //
72 // empty :: ([m],Bool,[m],Bool) -> ([m],Bool,[m],Bool)
73 // empty (_,rs,s,ss) = ([],rs,s,ss)