-import StdDebug,StdMisc
-process :: TCP_DuplexChannel a (IRCMessage a *World -> (Maybe [IRCMessage], a, *World)) *World -> (MaybeErrorString (), TCP_DuplexChannel, a, *World)
-process chan state bot w
-//Receive
-# (merr_resp, chan, w) = recv chan w
-| isError merr_resp = (Error (fromError merr_resp), chan, state, w)
-# (Ok mresp) = merr_resp
-| isNothing mresp = process chan state bot w
-| not (trace_tn $ "Received: " +++ fromJust mresp) = undef
-//Process
-= case parseIRCMessage (fromJust mresp) of
- (Left err) = (Error $ "IRC Parsing error: " +++ join "\n" err, chan, state, w)
- (Right msg)
- # (mircc, state, w) = bot msg state w
- | isNothing mircc = (Ok (), chan, state, w) // Bot asks to quit
- //Possible send the commands
- # (merr, chan, w) = send (map toString $ fromJust mircc) chan w
- | isError merr = (Error $ fromError merr, chan, state, w)
- //Recurse
- = process chan state bot w
+process :: TCP_DuplexChannel String .a (IRCMessage -> (.a -> .(*World -> *(Maybe [IRCMessage], .a, *World)))) *World -> (MaybeErrorString (), TCP_DuplexChannel, .a, *World)
+process chan acc state bot w
+//See if we have a message
+= case split "\r\n" acc of
+ //We only have one message that is not complete
+ [m]
+ //Receive
+ # (merr_resp, chan, w) = recv chan w
+ | isError merr_resp = (Error (fromError merr_resp), chan, state, w)
+ # (Ok mresp) = merr_resp
+ | isNothing mresp = process chan acc state bot w
+ = process chan (m +++ fromJust mresp) state bot w
+ //We have a successfull split and therefore we process at least one message
+ [m:xs]
+ # acc = join "\r\n" xs
+ = case parseIRCMessage $ m +++ "\r\n" of
+ (Left err) = (Error $ "IRC Parsing error: " +++ join "\n" err, chan, state, w)
+ (Right msg)
+ # (mircc, state, w) = bot msg state w
+ | isNothing mircc = (Ok (), chan, state, w) // Bot asks to quit
+ //Possible send the commands
+ # (merr, chan, w) = send (map toString $ fromJust mircc) chan w
+ | isError merr = (Error $ fromError merr, chan, state, w)
+ //Recurse
+ = process chan acc state bot w