uds
[clean-tests.git] / uds / param / ASDS / Source.icl
1 implementation module ASDS.Source
2
3 import Data.Func
4 import Data.Functor
5 import Control.Monad
6 import ASDS
7
8 rwpair :: (sdsr m p r w) (sdsw m p r w) -> RWPair sdsr sdsw m p r w | pure m
9 rwpair l r = RWPair l r (pure ())
10
11 source :: (p -> m r) (p w -> m ()) -> Source m p r w | pure m
12 source read write = rwpair (ReadSource read) (WriteSource write)
13
14 instance read ReadSource
15 where
16 read (ReadSource read) p = Read <$> read p
17
18 instance write WriteSource
19 where
20 write (WriteSource write) p w = Written <$> write p w
21
22 instance read (RWPair sdsr sdsw) | read sdsr
23 where
24 read (RWPair s w _) p = read s p >>= \v->case v of
25 Reading s = pure $ Reading (rwpair s w)
26 Read r = pure $ Read r
27
28 instance write (RWPair sdsr sdsw) | write sdsw
29 where
30 write (RWPair r s _) p w = write s p w >>= \v->case v of
31 Writing s = pure $ Writing $ rwpair r s
32 Written _ = pure $ Written ()
33
34 constShare :: a -> ReadSource m p a b | pure m
35 constShare a = ReadSource \_->pure a
36
37 nullShare :: WriteSource m p a b | pure m
38 nullShare = WriteSource \_ _->pure ()