Programmers wanting to access the entire \gls{SDS} use the \CI{deviceStoreNP}.
Programmers wanting to access a single \gls{SDS} on a device can use the
\CI{getRealShare} function which is a wrapper around the \CI{deviceStore} which
-applies a parametric lens.
+applies a parametric lens to the \gls{SDS}.
\begin{lstlisting}[label={lst:actualdev},%
caption={Real types for the device \gls{SDS}}]
\end{lstlisting}
\subsection{Parametric Lens}
-Therefore the main device store
-\todo{Semantiek van shares, hoe ze in iTasks zijn, hoe typering}
+The type of the parametric lens is \CI{Maybe (MTaskDevice, Int)} where the
+\CI{Int} is the identifier of the \gls{SDS}. The \gls{iTasks} way of applying
+lenses is through the \CI{sdsFocus} function and through the \CI{sdsLens}
+functions. \CI{sdsFocus} allows the programmer to fix the parameter.
+\CI{sdsLens} is basically a \CI{mapReadWrite} that has access to the parameter.
+This allows the programmer to create filters and lenses. Both of the methods
+are not good enough for the device \gls{SDS} because they do not achieve the
+writing to the actual device. Writing to a device requires being able to write
+to shares. To solve this problem, a real base \gls{SDS} is created. All the
+details are visible in Listing~\ref{shareimpl}.
+\todo{elaborate}
+
+\begin{lstlisting}[label={lst:shareimpl},%
+ caption={Base share implementation}]
+realDeviceStore :: Shared [MTaskDevice]
+realDeviceStore = memoryShare "mTaskDevices" []
+
+deviceStore :: RWShared (Maybe (MTaskDevice, Int)) [MTaskDevice] [MTaskDevice]
+deviceStore = SDSSource {SDSSource | name="deviceStore", read=realRead, write=realWrite}
+where
+ realRead :: (Maybe (MTaskDevice,Int)) *IWorld -> (MaybeError TaskException [MTaskDevice], *IWorld)
+ realRead p iw = read realDeviceStore iw
+
+ realWrite :: (Maybe (MTaskDevice,Int)) [MTaskDevice] *IWorld
+ -> (MaybeError TaskException (SDSNotifyPred (Maybe (MTaskDevice,Int))), *IWorld)
+ realWrite mi w iw
+ # (merr, iw) = write w realDeviceStore iw
+ | isError merr || isNothing mi = (merr $> notifyPred mi, iw)
+ # (Just (dev, ident)) = mi
+ | ident == -1 = (merr $> notifyPred mi, 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 = case sendMessagesIW [MTUpd ident s.MTaskShare.value] dev iw of
+ (Error e, iw) = (Error e, iw)
+ (Ok _, iw) = (Ok $ notifyPred mi, iw)
+
+ notifyPred :: (Maybe (MTaskDevice, Int)) (Maybe (MTaskDevice, Int)) -> Bool
+ notifyPred Nothing Nothing = True
+ notifyPred Nothing (Just _) = False
+ notifyPred (Just _) Nothing = False
+ notifyPred (Just (d1, -1)) (Just (d2, _)) = d1 == d2
+ notifyPred (Just (d1, i1)) (Just (d2, i2)) = d1 == d2 && i1 == i2
+\end{lstlisting}