add uds and auds implementations
[clean-tests.git] / uds / uds.dcl
1 definition module uds
2
3 from Control.Applicative import class Applicative, class pure, class <*>
4 from Control.Monad import class Monad
5 from Control.Monad.State import :: StateT
6 from Data.Either import :: Either
7 from Data.Functor import class Functor
8 from Data.Map import :: Map
9 from StdMaybe import :: Maybe
10 from StdOverloaded import class <, class fromString
11 from System.FilePath import :: FilePath
12 from System.IO import :: IO
13 from System.Time import :: Timestamp
14
15 class MonadFail m | Monad m where fail :: String -> m a
16 instance MonadFail Maybe, []
17 instance MonadFail (Either a) | fromString a
18 instance MonadFail (StateT s m) | MonadFail m
19
20 class read v :: (v m r w) -> m r | TC r & Monad m
21 class write v :: w (v m r w) -> m () | TC w & Monad m
22 upd :: (r -> w) (v m r w) -> m w | TC r & TC w & read, write v & Monad m
23
24 sds :: (sds m r w) -> SDS m r w | read sds & write sds & Monad m
25 :: SDS m r w = E.sds: SDS (sds m r w) (m ()) /*force kind*/ & read sds & write sds
26
27 instance read SDS, ReadSource, Source
28 instance read (Par sdsl sdsr) | read sdsl & read sdsr
29 instance read (Lens sds) | read sds
30 instance read (Select sdsl sdsr) | read sdsl & read sdsr
31
32 instance write SDS, WriteSource, Source
33 instance write (Par sdsl sdsr) | write sdsl & write sdsr
34 instance write (Lens sds) | read sds & write sds
35 instance write (Select sdsl sdsr) | read sdsl & write sdsr
36
37 :: ReadSource m r w = ReadSource (m r)
38 :: WriteSource m r w = WriteSource (w -> m ())
39
40 source :: (m r) (w -> m ()) -> Source m r w
41 :: Source m r w = Source (ReadSource m r w) (WriteSource m r w)
42
43 par :: (r1 r2 -> m r) (w -> m (w1, w2)) (sdsl m r1 w1) (sdsr m r2 w2) -> Par sdsl sdsr m r w | TC r1 & TC r2 & TC w1 & TC w2
44 :: Par sdsl sdsr m r w = E.r1 r2 w1 w2: Par (ParOpts sdsl sdsr m r1 r2 w1 w2 r w) & TC r1 & TC r2 & TC w1 & TC w2
45 :: ParOpts sdsl sdsr m r1 r2 w1 w2 r w =
46 { readl :: r1 r2 -> m r
47 , writel :: w -> m (w1, w2)
48 , left :: sdsl m r1 w1
49 , right :: sdsr m r2 w2
50 }
51
52 lens :: (r1 -> m r) (w r1 -> m w1) (sds m r1 w1) -> Lens sds m r w | TC r1 & TC w1
53 :: Lens sds m r w = E.r1 w1: Lens (LensOpts sds m r1 w1 r w) & TC r1 & TC w1
54 :: LensOpts sds m r1 w1 r w =
55 { mapr :: r1 -> m r
56 , mapw :: w r1 -> m w1
57 , lens :: sds m r1 w1
58 }
59
60 select :: (sdsl m r1 w1) (r1 -> sdsr m r w) -> Select sdsl sdsr m r w | TC r1 & TC w1 & Monad m
61 :: Select sdsl sdsr m r w = E.r1 w1: Select (SelectOpts sdsl sdsr m r1 w1 r w) & TC r1 & TC w1
62 :: SelectOpts sdsl sdsr m r1 w1 r w =
63 { select :: sdsl m r1 w1
64 , bind :: r1 -> sdsr m r w
65 , unused :: m () //* to force correct kinds
66 }
67
68 constShare :: a -> ReadSource m a () | Monad m
69 nullShare :: WriteSource m () a | Monad m
70
71 timeStamp :: ReadSource IO Timestamp ()
72
73 mapRead :: (r -> r`) (sds m r w) -> Lens sds m r` w | TC r` & TC r & TC w & Monad m
74 (>?@) infixl 6
75 (>?@) :== mapRead
76 mapWrite :: (w` r -> m w) (sds m r w) -> Lens sds m r w` | TC r & TC w & TC w` & Monad m
77 (>!@) infixl 6
78 (>!@) :== mapWrite
79
80 (>*<) infixl 6 :: (sdsl m r1 w1) (sdsr m r2 w2) -> Par sdsl sdsr m (r1, r2) (w1, w2) | TC r1 & TC r2 & TC w1 & TC w2 & Monad m
81
82 fromDynStore :: (sds m Dynamic Dynamic) -> Lens sds m r w | TC r & TC w & MonadFail m
83 toDynStore :: (sds m r w) -> Lens sds m Dynamic Dynamic | TC r & TC w & MonadFail m
84
85 indexedStore :: Int (sds m [a] [a]) -> Lens sds m a a | TC a & MonadFail m
86 keyedStore :: k (sds m (Map k v) (Map k v)) -> Lens sds m v v | TC v & TC k & < k & MonadFail m
87
88 indexedSelect :: (sdsl m Int z) (sdsr m [a] [a]) -> Select sdsl (Lens sdsr) m a a | TC a & TC z & MonadFail m
89 keyedSelect :: (sdsl m k z) (sdsr m (Map k v) (Map k v)) -> Select sdsl (Lens sdsr) m v v | TC z & TC v & TC k & < k & MonadFail m
90
91 astore :: String -> Lens (Lens Source) (StateT (Map String Dynamic) m) a a | MonadFail m & TC a
92 dstore :: String -> Lens Source (StateT (Map String Dynamic) m) Dynamic Dynamic | MonadFail m
93 store :: (Source (StateT (Map String Dynamic) m) (Map String Dynamic) (Map String Dynamic)) | Monad m
94
95 file :: FilePath -> Source IO String String