implementation module Utils.SDS import iTasks 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 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 (MTaskDevice, Int)) [MTaskDevice] [MTaskDevice] deviceStore = SDSSource {SDSSource | name = "deviceStore" , read = \_->read realDeviceStore , 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" [] bcStateStore :: Shared BCState bcStateStore = memoryShare "mTaskBCState" zero mTaskTaskStore :: Shared [String] mTaskTaskStore = memoryShare "mTaskTasks" $ 'DM'.keys allmTasks