gengeng
[clean-tests.git] / uds / ASDS.icl
1 implementation module ASDS
2
3 import StdEnv
4
5 import Data.Functor
6 import Control.Monad
7 import Control.Monad.State
8 import Control.Monad.Trans
9
10 import ASDS.Source
11 import ASDS.Lens
12 import ASDS.Select
13 import ASDS.Parallel
14
15 sds :: (sds m p r w) -> SDS m p r w | read, write, observe sds & Monad m
16 sds s = SDS s (pure ())
17
18 instance read SDS where read (SDS s _) p = read s p
19 instance write SDS where write (SDS sds _) p w = write sds p w
20 instance observe SDS
21 where
22 identity (SDS sds _) c = identity sds c
23 observe (SDS sds _) p oid handle = observe sds p oid handle
24
25 getShare :: (sds m () r w) -> PViewT m r | Monad m & read sds & TC r & TC w
26 getShare s = read s () >>= \v->case v of
27 Reading s = getShare s
28 Read r = liftT (pure r)
29
30 setShare :: w (sds m () r w) -> PViewT m () | Monad m & write sds & TC r & TC w
31 setShare w s = write s () w >>= \v->case v of
32 Writing s = setShare w s
33 Written _ = liftT (pure ())
34
35 updShare :: (r -> w) (sds m () r w) -> PViewT m w | Monad m & read sds & write sds & TC r & TC w
36 updShare f s = f <$> getShare s >>= \v->setShare v s >>| liftT (pure v)
37
38 trigger :: (p -> Bool) -> PViewT m () | TC p & Monad m
39 trigger inv = gets (filter (match inv)) >>= mapM_ run
40 where
41 match :: (p -> Bool) (NRequest m) -> Bool | TC p
42 match inv (NRequest oid ohnd (a :: p^)) = inv a
43 match _ _ = False
44
45 run :: (NRequest m) -> PViewT m () | Monad m
46 run (NRequest oid ohnd _) = liftT ohnd