3 import StdDebug, StdMisc
5 from Text import class Text(concat,join,split), instance Text String
10 derive class iTask MTaskMessage
12 Start :: *World -> *World
13 Start world = startEngine (
14 enterInformation "Port Number?" []
15 >>= \port->withShared ([], False, [], False) (mTaskTask port)
17 //Start world = startEngine mTaskTask world
19 mTaskTask :: Int (Shared ([MTaskMessage],Bool,[MTaskMessage],Bool)) -> Task ()
21 syncNetworkChannel "localhost" port "\n" decode encode ch ||-
23 sendMsg msgs ch >>= \_->
24 viewSharedInformation "channels" [ViewWith lens] ch @! ()
25 ) >>* [OnAction ActionFinish (always shutDown)]
27 lens :: ([MTaskMessage],Bool,[MTaskMessage],Bool) -> ([String], [String])
28 lens (r,_,s,_) = (f r, f s)
32 f [x:xs] = [toString x:f xs]
34 msgs = toMessages 500 (toRealByteCode (unMain bc))
36 bc :: Main (ByteCode Int Stmt)
37 bc = sds \x=0 In {main = x =. x +. lit 1 :. pub x}
39 sendMsg :: [MTaskMessage] (Shared ([MTaskMessage],Bool,[MTaskMessage],Bool)) -> Task ()
40 sendMsg m ch = upd (\(r,rs,s,ss)->(r,rs,s ++ m,ss)) ch @! ()
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} @! ()
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))
55 = (Ok acc,write,map encodeFun send,False)
57 onDisconnect l (received,receiveStopped,send,sendStopped)
58 = (Ok l,Just (received,True,send,sendStopped))
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) @! ()
64 // ifProcess (received,receiveStopped,_,_)
65 // = receiveStopped || (not (isEmpty received))
67 // process (received,receiveStopped,_,_)
68 // = upd empty channel
69 // >>| if (isEmpty received) (return ()) (processTask received)
72 // empty :: ([m],Bool,[m],Bool) -> ([m],Bool,[m],Bool)
73 // empty (_,rs,s,ss) = ([],rs,s,ss)