uds
[clean-tests.git] / uds / param / ASDS.icl
1 implementation module ASDS
2
3 import Data.Functor
4 import Control.Monad
5 import Control.Monad.State
6
7 import ASDS.Source
8 import ASDS.Lens
9 import ASDS.Select
10 import ASDS.Parallel
11
12 sds :: (sds m p r w) -> SDS m p r w | read sds & write sds & Monad m
13 sds s = SDS s (pure ())
14
15 instance read SDS where read (SDS s _) p = read s p
16 instance write SDS where write (SDS sds _) p w = write sds p w
17
18 getShare :: (sds m () r w) -> m r | Monad m & read sds & TC r & TC w
19 getShare s = read s () >>= \v->case v of
20 Reading s = getShare s
21 Read r = pure r
22
23 setShare :: w (sds m () r w) -> m () | Monad m & write sds & TC r & TC w
24 setShare w s = write s () w >>= \v->case v of
25 Writing s = setShare w s
26 Written _ = pure ()
27
28 updShare :: (r -> w) (sds m () r w) -> m w | Monad m & read sds & write sds & TC r & TC w
29 updShare f s = f <$> getShare s >>= \v->setShare v s >>| pure v