1 implementation module ASDS.Source
7 import Control.Monad.State
8 import Control.Monad.Trans
11 rwpair :: (sdsr m p r w) (sdsw m p r w) -> RWPair sdsr sdsw m p r w | pure m
12 rwpair l r = RWPair l r (pure ())
14 source :: (p -> m r) (p w -> m ()) -> Source m p r w | pure m
15 source read write = rwpair (ReadSource read) (WriteSource write)
17 instance read ReadSource
19 read (ReadSource read) p = Read <$> liftT (read p)
21 instance write WriteSource
23 write (WriteSource write) p w = Written <$> liftT (write p w)
25 instance observe WriteSource
27 observe sds p oid hnd = modify \s->[NRequest oid hnd (dynamic p):s]
29 instance read (RWPair sdsr sdsw) | read sdsr
31 read (RWPair s w _) p = read s p >>= \v->case v of
32 Reading s = pure $ Reading (rwpair s w)
33 Read r = pure $ Read r
35 instance write (RWPair sdsr sdsw) | write sdsw
37 write (RWPair r s _) p w = write s p w >>= \v->case v of
38 Writing s = pure $ Writing $ rwpair r s
39 Written _ = pure $ Written ()
41 instance observe (RWPair sdsr sdsw) | observe sdsw
43 observe (RWPair r s _) p oid hnd = observe s p oid hnd
45 constShare :: a -> ReadSource m p a b | pure m
46 constShare a = ReadSource \_->pure a
48 nullShare :: WriteSource m p a b | pure m
49 nullShare = WriteSource \_ _->pure ()