1 implementation module uds
10 import Control.Applicative
12 import Control.Monad.State
13 import Control.Monad.Trans
14 import qualified Data.Map
15 import System.FilePath
20 instance MonadFail Maybe where fail _ = Nothing
21 instance MonadFail [] where fail _ = []
22 instance MonadFail (Either a) | fromString a where fail s = Left $ fromString s
23 instance MonadFail (StateT s m) | MonadFail m where fail s = liftT $ fail s
25 sds :: (sds m r w) -> SDS m r w | read sds & write sds & Monad m
26 sds s = SDS s (pure ())
27 instance read SDS where read (SDS sds _) = read sds
28 instance write SDS where write w (SDS sds _) = write w sds
30 source :: (m r) (w -> m ()) -> Source m r w
31 source read write = Source (ReadSource read) (WriteSource write)
33 constShare :: a -> ReadSource m a () | Monad m
34 constShare a = ReadSource (pure a)
36 nullShare :: WriteSource m () a | Monad m
37 nullShare = WriteSource (\_->pure ())
39 instance read ReadSource where read (ReadSource read) = read
40 instance write WriteSource where write w (WriteSource write) = write w
41 instance read Source where read (Source s _) = read s
42 instance write Source where write w (Source _ s) = write w s
44 upd :: (r -> w) (v m r w) -> m w | TC r & TC w & read, write v & Monad m
45 upd fun sds = read sds >>= \r
47 = write w sds >>| pure w
49 timeStamp :: ReadSource IO Timestamp ()
50 timeStamp = ReadSource $ withWorld time
52 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
53 par readl writel left right = Par {readl=readl,writel=writel,left=left,right=right}
55 (>*<) 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
56 (>*<) l r = par (\x y->pure (x, y)) pure l r
58 instance read (Par sdsl sdsr) | read sdsl & read sdsr
60 read (Par {readl,left,right}) = join $ readl <$> read left <*> read right
61 instance write (Par sdsl sdsr) | write sdsl & write sdsr
63 write w (Par {writel,left,right})
64 = writel w >>= \(w1, w2)->write w1 left >>| write w2 right
66 lens :: (r1 -> m r) (w r1 -> m w1) (sds m r1 w1) -> Lens sds m r w | TC r1 & TC w1
67 lens mapr mapw lens = Lens {mapr=mapr,mapw=mapw,lens=lens}
69 instance read (Lens sds) | read sds
71 read (Lens {mapr,lens}) = read lens >>= mapr
72 instance write (Lens sds) | read sds & write sds
74 write w (Lens {mapw,lens}) = read lens >>= mapw w >>= flip write lens
76 mapRead :: (r -> r`) (sds m r w) -> Lens sds m r` w | TC r` & TC r & TC w & Monad m
77 mapRead f sds = lens (pure o f) (const o pure) sds
79 fromDynStore :: (sds m Dynamic Dynamic) -> Lens sds m r w | TC r & TC w & MonadFail m
80 fromDynStore sds = lens
83 _ = fail "type mismatch")
84 (\w _->pure (dynamic w))
87 toDynStore :: (sds m r w) -> Lens sds m Dynamic Dynamic | TC r & TC w & MonadFail m
89 (\r->pure (dynamic r))
92 _ = fail "type mismatch")
95 mapWrite :: (w` r -> m w) (sds m r w) -> Lens sds m r w` | TC r & TC w & TC w` & Monad m
96 mapWrite f sds = lens pure f sds
98 indexedStore :: Int (sds m [a] [a]) -> Lens sds m a a | TC a & MonadFail m
99 indexedStore idx sds = lens
100 (\r->maybe (fail "out of range") pure (r !? idx))
101 ((o) pure o updateAt idx)
102 // (\w->pure o updateAt idx w)
105 keyedStore :: k (sds m ('Data.Map'.Map k v) ('Data.Map'.Map k v)) -> Lens sds m v v | TC v & TC k & < k & MonadFail m
106 keyedStore key sds = lens
107 (maybe (fail "key not present") pure o 'Data.Map'.get key)
108 ((o) pure o 'Data.Map'.put key)
109 // (\w->pure o 'Data.Map'.put key w)
112 select :: (sdsl m r1 w1) (r1 -> sdsr m r w) -> Select sdsl sdsr m r w | TC r1 & TC w1 & Monad m
113 select select bind = Select {select=select,bind=bind,unused=pure ()}
115 instance read (Select sdsl sdsr) | read sdsl & read sdsr
117 read (Select {select,bind}) = read select >>= read o bind
118 instance write (Select sdsl sdsr) | read sdsl & write sdsr
120 write w (Select {select,bind}) = read select >>= write w o bind
122 indexedSelect :: (sdsl m Int z) (sdsr m [a] [a]) -> Select sdsl (Lens sdsr) m a a | TC a & TC z & MonadFail m
123 indexedSelect l r = select l $ flip indexedStore r
125 keyedSelect :: (sdsl m k z) (sdsr m ('Data.Map'.Map k v) ('Data.Map'.Map k v))
126 -> Select sdsl (Lens sdsr) m v v | TC z & TC v & TC k & < k & MonadFail m
127 keyedSelect l r = select l $ flip keyedStore r
129 //Start :: Either String ('Data.Map'.Map String Dynamic)
130 //Start :: Either String (Int, 'Data.Map'.Map String Dynamic)
131 //Start = runStateT t $ 'Data.Map'.singleton "blurp" (dynamic 38)
133 // t = write (42, "blurp") (astore "foo" >*< astore "bar")
134 // t = write 42 (astore "blurp")
135 // >>| read (astore "blurp")
137 //Start world = evalIO t world
139 // t = read (file "test.icl")
141 astore :: String -> Lens (Lens Source) (StateT ('Data.Map'.Map String Dynamic) m) a a | MonadFail m & TC a
142 astore s = fromDynStore $ dstore s
144 dstore :: String -> Lens Source (StateT ('Data.Map'.Map String Dynamic) m) Dynamic Dynamic | MonadFail m
145 dstore s = keyedStore s store
147 store :: (Source (StateT ('Data.Map'.Map String Dynamic) m) ('Data.Map'.Map String Dynamic) ('Data.Map'.Map String Dynamic)) | Monad m
148 store = Source (ReadSource getState) (WriteSource put)
150 file :: FilePath -> Source IO String String
151 file p = source (readFileM p) (writeFileM p)