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