uds
[clean-tests.git] / uds / test.icl
1 module test
2
3 import StdEnv
4 import Data.Maybe
5 import Data.Functor
6 import Data.Func
7 import Control.Applicative
8 import Control.Monad
9 import qualified Data.Map
10
11 class get v ~st
12 where
13 get :: (v r w) .st -> .(Maybe r, .st) | TC r
14 class put v ~st
15 where
16 put :: w (v r w) .st -> .(Maybe (), .st) | TC w
17
18 :: Source r w = Source String
19 :: St :== 'Data.Map'.Map String Dynamic
20
21 instance get Source St
22 where
23 get (Source n) st = case 'Data.Map'.get n st of
24 Just (a :: a^) = (Just a, st)
25 _ = (Nothing, st)
26
27 instance put Source St
28 where
29 put w (Source n) st = (Just (), 'Data.Map'.put n (dynamic w) st)
30
31 :: Par sdsl sdsr r w = E.r1 r2 w1 w2: Par (ParOpts sdsl sdsr r1 r2 w1 w2 r w)
32 & TC r1 & TC r2 & TC w1 & TC w2
33 :: ParOpts sdsl sdsr r1 r2 w1 w2 r w =
34 { read :: r1 r2 -> Maybe r
35 , write :: w -> Maybe (w1, w2)
36 , left :: (sdsl r1 w1)
37 , right :: (sdsr r2 w2)
38 }
39
40 instance get (Par sdsl sdsr) St | get sdsl St & get sdsr St
41 where
42 get (Par {read,left,right}) st
43 # (ml, st) = get left st
44 # (mr, st) = get right st
45 = (join $ read <$> ml <*> mr, st)
46 instance put (Par sdsl sdsr) St | put sdsl St & put sdsr St
47 where
48 put w (Par {write,left,right}) st
49 = case write w of
50 Nothing = (Nothing, st)
51 Just (w1, w2)
52 # (ml, st) = put w1 left st
53 # (mr, st) = put w2 right st
54 = (ml *> mr, st)
55
56 Start :: (Maybe Int, .St)
57 Start
58 # st = 'Data.Map'.newMap
59 # (Just _, st) = put 42 (Source "blurp") st
60 = get (Source "blurp") st