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
+import StdDebug
+
memoryShare :: String a -> Shared a | iTask a
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 (\d->d.identifier == ident) deviceShares of
+ Nothing = (Error $ exception $ "deviceStore: Share doesn't exist: " +++ toString ident, iw)
+ Just s
+ | not $ trace_tn "Really sending a message from a share update" = undef
+ = 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" []