@@ -1,68 +0,0 @@
7− Thunk : (Type -> Type) -> Type
8− Thunk m = (t : Type) -> Threads m ->
9− (Threads m -> () -> m t) -> m t
11− data Threads : (Type -> Type) -> Type where
12− MkThreads : List (Thunk m) -> List (Thunk m) -> Threads m
14−initThreads : Monad m => Threads m
15−initThreads = MkThreads [] []
17−data Threading : (Type -> Type) -> Effect where
18− Yield : Threading m (Threads m) (Threads m) ()
19− Fork : Threading m (Threads m) (Threads m) Bool
21−instance Monad m => Effective (Threading m) m where
22− runEffect (MkThreads ds []) Yield k
23− = k (MkThreads [] (reverse ds)) ()
24− runEffect (MkThreads ds (q :: qs)) Yield k
25− = q _ (MkThreads (newThread :: ds) qs) k
26− where newThread _ st k' = do k st ()
29− runEffect (MkThreads ds qs) Fork k
30− = k (MkThreads ds (newThread :: qs)) False
31− where newThread t st k' = do t <- k st True
34−THREADING : (Type -> Type) -> EFF
35−THREADING m = MkEff (Threads m) (Threading m)
37−fork : Monad m => (EffT m [THREADING m] ()) -> EffT m [THREADING m] ()
38−fork prog = do branch <- effect Fork
39− if branch then prog else return ()
41−yield : Monad m => EffT m [THREADING m] ()
44−printA : Int -> Eff [THREADING m, STATE String] ()
46−printA n = do s <- lift get
47− lift (put (s ++ "A"))
51−printB : Int -> Eff [THREADING m, STATE String] ()
53−printB n = do s <- lift get
54− lift (put (s ++ "B"))
58−printAB : Int -> Eff [THREADING m, STATE String] String
59−printAB n = do branch <- effect Fork
60− if branch then printA n
66−main = print $ runPure [initThreads, ""] (printAB 10)