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