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