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