use share lenses
[mTask.git] / Shares / mTaskShare.icl
index edd84d0..c22843f 100644 (file)
@@ -13,7 +13,7 @@ from StdFunc import flip
 derive class iTask MTaskShare
 
 manageShares :: Task [MTaskDevice]
-manageShares = whileUnchanged deviceStore
+manageShares = whileUnchanged (sdsFocus (Just -1) deviceStore)
        $ \devs->case devs of
                [] = viewInformation "No devices yet" [] []
                _ = allTasks (map manageSharesOnDevice devs)
@@ -25,7 +25,7 @@ manageSharesOnDevice dev = (case dev.deviceShares of
        ) >>| treturn dev
 
 updateShares :: MTaskDevice ([MTaskShare] -> [MTaskShare]) -> Task [MTaskShare]
-updateShares dev tfun = upd (map upFun) deviceStore 
+updateShares dev tfun = upd (map upFun) (sdsFocus (Just -1) deviceStore)
                @ (\d->d.deviceShares) o fromJust o find ((==)dev)
        where
                upFun d = if (dev == d) ({d&deviceShares=tfun d.deviceShares}) d
@@ -67,14 +67,6 @@ makeShare withTask identifier value = {MTaskShare
                ,value=value
                }
 
-if` i t e = if i t e
-
-updateShareFromPublish :: MTaskDevice Int BCValue -> Task [MTaskShare]
-updateShareFromPublish dev ident val = updateShares dev $ map $ up ident val
-       where
-               up :: Int BCValue MTaskShare -> MTaskShare
-               up i v s = if (s.identifier == i) {MTaskShare | s & value=val} s
-
 import GenPrint, StdMisc, StdDebug, TTY
 derive gPrint MTaskDevice, MTaskShare, Maybe, MTaskResource, MTaskTask, TaskId, TTYSettings, TCPSettings, DateTime
 derive gPrint Parity, BaudRate, ByteSize
@@ -100,29 +92,38 @@ getRealShare :: MTaskDevice MTaskShare -> Shared BCValue
 getRealShare dev share=:{identifier} = sdsFocus (Just identifier) $ SDSSource {SDSSource
        | name = "mTaskShareMap-" +++ toString identifier, read=rr, write=ww}
        where
-               rr name iworld = case read deviceStore iworld of
+               rr name iworld = case read (sdsFocus (Just identifier) deviceStore) iworld of
                        (Error e, iworld) = (Error e, iworld)
                        (Ok devices, iworld) = case find ((==)dev) devices of
                                Nothing = (Error $ exception "Device doesn't exist anymore", iworld)
                                Just {deviceShares} = case find ((==)share) deviceShares of
                                        Nothing = (Error $ exception "Share doesn't exist", iworld)
-                                       Just share = (Ok share.MTaskShare.value, iworld)
+                                       Just s = (Ok s.MTaskShare.value, iworld)
                        
                // Also send messages
                ww name value iworld
                | not (trace_tn ("Update to: " +++ printToString value)) = undef
-               = case modify (tuple () o modifyValue value) deviceStore iworld of
+               = case modify (tuple () o modifyValue value) (sdsFocus (Just identifier) deviceStore) iworld of
                        (Error e, iworld) = (Error e, iworld)
                        (Ok _, iworld) = case sendMessagesIW [MTUpd identifier value] dev iworld of
                                (Error e, iworld) = (Error e, iworld)
-                               (Ok _, iworld) = (Ok $ maybe True ((==) identifier), iworld)
+                               (Ok _, iworld) = (Ok $ const True, iworld)
 
                modifyValue :: BCValue [MTaskDevice] -> [MTaskDevice]
-               modifyValue v ds = filterMap ((==)dev) deviceUpdate ds
-               where
-                       deviceUpdate d = {MTaskDevice | d
-                               & deviceShares=filterMap ((==)share) shareUpd d.deviceShares}
-                       shareUpd s = {MTaskShare | s & value=v}
-
-               filterMap :: (a -> Bool) (a -> a) [a] -> [a]
-               filterMap f t xs = [if (f x) (t x) x\\x<-xs]
+               modifyValue v ds = filterMap ((==)dev) (updateShare identifier v) ds
+
+filterMap :: (a -> Bool) (a -> a) [a] -> [a]
+filterMap f t xs = [if (f x) (t x) x\\x<-xs]
+
+getDeviceStoreForShare :: Int -> Shared [MTaskDevice]
+getDeviceStoreForShare ident = sdsFocus (Just ident) $ deviceStore
+
+updateShareFromPublish :: MTaskDevice Int BCValue -> Task [MTaskDevice]
+updateShareFromPublish dev ident val 
+       = upd (filterMap ((==)dev) (updateShare ident val)) $ getDeviceStoreForShare ident
+
+updateShare :: Int BCValue MTaskDevice -> MTaskDevice
+updateShare ident val dev = {MTaskDevice | dev & deviceShares=filterMap 
+       (\s->s.identifier==ident)
+       (\s->{MTaskShare | s & value=val})
+       dev.deviceShares}