module test import StdEnv import Data.Either import Data.Func import Data.Functor import Data.Functor.Identity from Data.Map import :: Map(..) import qualified Data.Map import Control.Monad import Control.Monad.State import Control.Monad.Fail import Control.Monad.Trans import System.IO import ASDS import ASDS.Source import ASDS.Lens import ASDS.Select import ASDS.Parallel instance MonadFail (Either String) where fail s = Left s readwrite :: r w (sds m () r w) -> PViewT m () | MonadFail m & read sds & write sds & TC r & TC w & == r readwrite r w sds = equal r (setShare w sds >>| getShare sds) equal :: a (PViewT m a) -> PViewT m () | MonadFail m & == a equal expected mon = mon >>= \v->if (v == expected) (pure ()) (fail "Not equal") //Start :: Either String (((), [NRequest Identity)]), Map String Dynamic) Start w = /*eval*/execIO (runStateT (observe intsource () "int" (putStrLn "blurp" >>| pure ()) >>| setShare 42 intsource) []) w import Debug.Trace intsource :: Source m () Int Int | pure m intsource = source "int" (\_->pure 42) (\_ _->pure (\_->True)) /* //Start :: Either String ((), Map String Dynamic) Start = runStateT (runStateT (sequence_ $ map test tests) []) 'Data.Map'.newMap where test t = liftT (put 'Data.Map'.newMap) >>| t // tests :: [StateT [NRequest (StateT (Map String Dynamic) (Either String))] (StateT (Map String Dynamic) (Either String)) ()] tests :: [PViewT (StateT (Map String Dynamic) (Either String)) ()] tests = flatten [ [readwrite i i sh \\ i<-[-1, 0, -100, 100]] , [setShare [0..10] sh >>| equal i (getShare (focus ((), i) (indexedStore sh)))\\i<-[0..10]] , [setShare [0..10] sh >>| setShare 42 (focus ((), i) (indexedStore sh)) >>| equal 42 (getShare (focus ((), i) (indexedStore sh)))\\i<-[0..10]] , [setShare [(i, i)\\i<-[0..10]] sh >>| equal i (getShare (focus ((), i) (assocStore sh)))\\i<-[0..10]] , [setShare ('Data.Map'.fromList [(i, i)\\i<-[0..10]]) sh >>| equal i (getShare (focus ((), i) (keyedStore sh)))\\i<-[0..10]] , [setShare [0..10] sh >>| setShare 4 (focus "idx" astore) >>| equal 4 (getShare $ focus ((), ()) $ selectList (focus "idx" astore) sh)] , [setShare 38 sh >>| equal 38 (getShare (After 100 sh (pure ())))] , [testpar (focus "foo" astore) (focus "bar" astore)] , [testpar (after 100 $ focus "foo" astore) (after 100 $ focus "bar" astore)] , [testpar (after 100 $ focus "foo" astore) (focus "bar" astore)] , [testpar (focus "foo" astore) (after 100 $ focus "bar" astore)] ] sh :: Lens (Lens (Lens (Lens (RWPair ReadSource WriteSource)))) (StateT (Map String Dynamic) m) () a a | MonadFail m & TC a sh = focus "foo" astore */ 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 testpar l r = setShare (42, 'a') (l >+< r) >>| equal (42, 'a') (getShare $ l >+< r) >>| equal 42 (getShare l) >>| equal 'a' (getShare r) >>| setShare 38 l >>| equal (38, 'a') (getShare $ l >+< r) >>| equal 38 (getShare l) >>| equal 'a' (getShare r) >>| setShare 'b' r >>| equal (38, 'b') (getShare $ l >+< r) >>| equal 38 (getShare l) >>| equal 'b' (getShare r) :: After sds m p r w = After Int (sds m p r w) (m ()) after :: Int (sds m p r w) -> After sds m p r w | pure m after i sds = After i sds $ pure () instance read (After sds) | read sds where read (After 0 sds _) p = read sds p read (After n sds m) p = pure (Reading (After (n-1) sds m)) instance write (After sds) | write sds where write (After 0 sds _) p w = write sds p w write (After n sds m) p w = pure (Writing (After (n-1) sds m)) astore :: Lens (Lens (Lens (RWPair ReadSource WriteSource))) (StateT (Map String Dynamic) m) String a a | MonadFail m & TC a astore = fromDynStore dstore dstore :: Lens (Lens (RWPair ReadSource WriteSource)) (StateT (Map String Dynamic) m) String Dynamic Dynamic | MonadFail m dstore = translate (\i->((), i)) $ keyedStore store store :: Source (StateT (Map String Dynamic) m) () (Map String Dynamic) (Map String Dynamic) | Monad m store = source "store" (\p->getState) \p w->(\p->True) <$ put w