1 module Eval exposing (..)
3 import Types exposing (..)
4 import IO exposing (IO)
9 apply : Eval a -> Env -> EvalContext a
10 apply (Eval f) state =
14 run : Env -> Eval a -> EvalContext a
19 withEnv : (Env -> Eval a) -> Eval a
26 setEnv : Env -> Eval ()
30 apply (succeed ()) state
33 modifyEnv : (Env -> Env) -> Eval ()
37 apply (succeed ()) (f state)
47 io : Cmd Msg -> (IO -> Eval a) -> Eval a
51 ( state, EvalIO cmd cont )
54 map : (a -> b) -> Eval a -> Eval b
59 ( state, EvalOk res ) ->
60 ( state, EvalOk (f res) )
62 ( state, EvalErr msg ) ->
63 ( state, EvalErr msg )
65 ( state, EvalIO cmd cont ) ->
66 ( state, EvalIO cmd (cont >> map f) )
69 andThen : (a -> Eval b) -> Eval a -> Eval b
74 ( state, EvalOk res ) ->
77 ( state, EvalErr msg ) ->
78 ( state, EvalErr msg )
80 ( state, EvalIO cmd cont ) ->
81 ( state, EvalIO cmd (cont >> andThen f) )
84 fail : String -> Eval a
88 ( state, EvalErr msg )
91 enter : Int -> List ( String, MalExpr ) -> Eval a -> Eval a
92 enter frameId bound body =
95 modifyEnv (Env.enter frameId bound)
96 |> andThen (\_ -> body)
99 modifyEnv (Env.leave env.currentFrameId)