7 import Data.Functor.Identity
8 from Data.Map import :: Map(..)
9 import qualified Data.Map
11 import Control.Monad.State
12 import Control.Monad.Fail
13 import Control.Monad.Trans
22 instance MonadFail (Either String) where fail s = Left s
24 readwrite :: r w (sds m () r w) -> PViewT m () | MonadFail m & read sds & write sds & TC r & TC w & == r
25 readwrite r w sds = equal r (setShare w sds >>| getShare sds)
27 equal :: a (PViewT m a) -> PViewT m () | MonadFail m & == a
28 equal expected mon = mon >>= \v->if (v == expected) (pure ()) (fail "Not equal")
30 //Start :: Either String (((), [NRequest Identity)]), Map String Dynamic)
31 Start w = /*eval*/execIO (runStateT (observe intsource () "int" (putStrLn "blurp" >>| pure ()) >>| setShare 42 intsource) []) w
35 intsource :: Source m () Int Int | pure m
36 intsource = source "int" (\_->pure 42) (\_ _->pure (\_->True))
39 //Start :: Either String ((), Map String Dynamic)
40 Start = runStateT (runStateT (sequence_ $ map test tests) []) 'Data.Map'.newMap
42 test t = liftT (put 'Data.Map'.newMap) >>| t
44 // tests :: [StateT [NRequest (StateT (Map String Dynamic) (Either String))] (StateT (Map String Dynamic) (Either String)) ()]
45 tests :: [PViewT (StateT (Map String Dynamic) (Either String)) ()]
47 [ [readwrite i i sh \\ i<-[-1, 0, -100, 100]]
48 , [setShare [0..10] sh >>| equal i (getShare (focus ((), i) (indexedStore sh)))\\i<-[0..10]]
49 , [setShare [0..10] sh >>| setShare 42 (focus ((), i) (indexedStore sh)) >>| equal 42 (getShare (focus ((), i) (indexedStore sh)))\\i<-[0..10]]
50 , [setShare [(i, i)\\i<-[0..10]] sh >>| equal i (getShare (focus ((), i) (assocStore sh)))\\i<-[0..10]]
51 , [setShare ('Data.Map'.fromList [(i, i)\\i<-[0..10]]) sh >>| equal i (getShare (focus ((), i) (keyedStore sh)))\\i<-[0..10]]
52 , [setShare [0..10] sh >>| setShare 4 (focus "idx" astore) >>| equal 4 (getShare $ focus ((), ()) $ selectList (focus "idx" astore) sh)]
53 , [setShare 38 sh >>| equal 38 (getShare (After 100 sh (pure ())))]
54 , [testpar (focus "foo" astore) (focus "bar" astore)]
55 , [testpar (after 100 $ focus "foo" astore) (after 100 $ focus "bar" astore)]
56 , [testpar (after 100 $ focus "foo" astore) (focus "bar" astore)]
57 , [testpar (focus "foo" astore) (after 100 $ focus "bar" astore)]
60 sh :: Lens (Lens (Lens (Lens (RWPair ReadSource WriteSource)))) (StateT (Map String Dynamic) m) () a a | MonadFail m & TC a
61 sh = focus "foo" astore
64 testpar :: (A.a: sds1 m () a a | TC, == a) (A.a: sds2 m () a a | TC, == a) -> PViewT m () | MonadFail m & read, write sds1 & read, write sds2
66 setShare (42, 'a') (l >+< r)
67 >>| equal (42, 'a') (getShare $ l >+< r) >>| equal 42 (getShare l) >>| equal 'a' (getShare r)
69 >>| equal (38, 'a') (getShare $ l >+< r) >>| equal 38 (getShare l) >>| equal 'a' (getShare r)
71 >>| equal (38, 'b') (getShare $ l >+< r) >>| equal 38 (getShare l) >>| equal 'b' (getShare r)
73 :: After sds m p r w = After Int (sds m p r w) (m ())
74 after :: Int (sds m p r w) -> After sds m p r w | pure m
75 after i sds = After i sds $ pure ()
77 instance read (After sds) | read sds
79 read (After 0 sds _) p = read sds p
80 read (After n sds m) p = pure (Reading (After (n-1) sds m))
82 instance write (After sds) | write sds
84 write (After 0 sds _) p w = write sds p w
85 write (After n sds m) p w = pure (Writing (After (n-1) sds m))
87 astore :: Lens (Lens (Lens (RWPair ReadSource WriteSource))) (StateT (Map String Dynamic) m) String a a | MonadFail m & TC a
88 astore = fromDynStore dstore
90 dstore :: Lens (Lens (RWPair ReadSource WriteSource)) (StateT (Map String Dynamic) m) String Dynamic Dynamic | MonadFail m
91 dstore = translate (\i->((), i)) $ keyedStore store
93 store :: Source (StateT (Map String Dynamic) m) () (Map String Dynamic) (Map String Dynamic) | Monad m
94 store = source "store" (\p->getState) \p w->(\p->True) <$ put w