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
12 rwpair l r = RWPair l r
14 source :: String (p -> m r) (p w -> m (p -> Bool)) -> Source m p r w
15 source name read write = rwpair (ReadSource read) (WriteSource name write)
17 instance read ReadSource
19 read (ReadSource read) p = Read <$> liftT (read p)
21 instance write WriteSource
23 write s=:(WriteSource _ write) p w = liftT (write p w)
24 >>= trigger s >>| pure (Written ())
26 instance identity WriteSource
28 identity (WriteSource n _) c = [n:c]
30 instance observe WriteSource
32 observe sds p oid hnd = modify (nrequestc p oid hnd)
34 instance read (RWPair sdsr sdsw) | read sdsr
36 read (RWPair s w) p = read s p >>= \v->case v of
37 Reading s = pure $ Reading (rwpair s w)
38 Read r = pure $ Read r
40 instance write (RWPair sdsr sdsw) | write sdsw
42 write (RWPair r s) p w = write s p w >>= \v->case v of
43 Writing s = pure $ Writing $ rwpair r s
44 Written _ = pure $ Written ()
46 instance identity (RWPair sdsr sdsw) | identity sdsw
48 identity (RWPair r w) c = identity w c
50 instance observe (RWPair sdsr sdsw) | observe sdsw
52 observe (RWPair r s) p oid hnd = observe s p oid hnd
54 constShare :: a -> ReadSource m p a b | pure m
55 constShare a = ReadSource \_->pure a
57 nullShare :: WriteSource m p a b | pure m
58 nullShare = WriteSource "null" \_ _->pure \_->False