shares are now lenses
[mTask.git] / Utils / SDS.icl
index a7c3763..3cd2566 100644 (file)
@@ -5,6 +5,7 @@ import iTasks._Framework.Store
 import Devices.mTaskDevice
 import Shares.mTaskShare
 import Tasks.Examples
+import Data.List
 import qualified Data.Map as DM
 from Data.Func import $
 import Data.Tuple
@@ -15,16 +16,29 @@ memoryShare s d = sdsFocus s $ memoryStore s $ Just d
 deviceStoreNP :: Shared [MTaskDevice]
 deviceStoreNP = sdsFocus Nothing $ deviceStore
 
-deviceStore :: RWShared (Maybe Int) [MTaskDevice] [MTaskDevice]
+deviceStore :: RWShared (Maybe (MTaskDevice, Int)) [MTaskDevice] [MTaskDevice]
 deviceStore = SDSSource {SDSSource 
        | name = "deviceStore"
        , read = \_->read realDeviceStore
-       , write= \p w->appFst ((<$) (lens p)) o write w realDeviceStore
-       } 
-
-lens Nothing _ = True
-lens _ Nothing = True
-lens (Just p) (Just p`) = p` == -1 || p == p`
+       , write= realWrite
+       }
+where
+       realWrite mi w iw
+       # (merr, iw) = write w realDeviceStore iw
+       | isError merr || isNothing mi = (merr $> const True, iw)
+       # (Just (dev, ident)) = mi
+       | ident == -1 = (merr $> const True, iw)
+       = case find ((==)dev) w of
+               Nothing = (Error $ exception "Device doesn't exist anymore", iw)
+               Just {deviceShares} = case find (\{identifier}->identifier == ident) deviceShares of
+                       Nothing = (Error $ exception $ "deviceStore: Share doesn't exist: " +++ toString ident, iw)
+                       Just s = case sendMessagesIW [MTUpd ident s.MTaskShare.value] dev iw of
+                               (Error e, iw) = (Error e, iw)
+                               (Ok _, iw) = (Ok $ lens mi, iw)
+
+       lens Nothing (Just p) = False
+       lens Nothing Nothing = True
+       lens (Just (d1, i1)) (Just (d2, i2)) = d1 == d2 && (i2 == -1 || i1 == i2)
 
 realDeviceStore :: Shared [MTaskDevice]
 realDeviceStore = sharedStore "mTaskDevices" []