-connectDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task Channels
-connectDevice procFun device = set ([], [], False) ch
- >>| appendTopLevelTask 'DM'.newMap True
- ( procFun device ch -||- catchAll (getSynFun device.deviceData ch) errHdl)
- >>= \tid->upd (\d->{d&deviceTask=Just tid,deviceError=Nothing}) (deviceShare device)
- >>| upd (\(r,s,ss)->(r,s++[MTSpec],ss)) ch
+process :: MTaskDevice (Shared Channels) -> Task ()
+process device ch = forever $ wait "process" (not o isEmpty o fst3) ch
+ >>= \(r,s,ss)->upd (appFst3 (const [])) ch >>| proc r
+where
+ proc :: [MTaskMSGRecv] -> Task ()
+ proc [] = treturn ()
+ proc [m:ms] = (case m of
+ MTPub i val = updateShareFromPublish device i val @! ()
+ ...
+ MTDevSpec s = deviceAddSpec device s @! ()
+ ) >>| proc ms
+
+connectDevice :: MTaskDevice -> Task Channels
+connectDevice device = set ([], [], False) ch
+ >>| appendTopLevelTask 'DM'.newMap True
+ ( process device ch -||- catchAll (getSynFun device.deviceData ch) errHdl)
+ >>= \tid->upd (\d->{d&deviceTask=Just tid,deviceError=Nothing}) (deviceShare device)
+ >>| set (r,[MTSpec],ss) ch
+ >>| treturn device