module Casui.Casui where import Casui.Module import Casui.Value import Casui.Name data Env = Env { envModuleLibrary :: ModuleLibrary -- TODO } data Context = Context { ctxLocal :: [(Symbol, Expression)], ctxModules :: ModuleList Expression } data Casui s a = Casui (s -> Context -> Env -> IO (a, Env)) instance Monad (Casui l) where (Casui f) >>= g = Casui $ \s c e -> do (a, e) <- f s c e let Casui h = g a h s c e return a = Casui $ \s c e -> return (a, e) instance Functor (Casui s) where fmap g (Casui f) = Casui $ \s c e -> do (a, e) <- f s c e return (g a, e) env :: Casui s Env env = Casui $ \s c e -> return $ (,) e e withContext :: Context -> Casui s a -> Casui s a withContext c (Casui f) = Casui $ \s _ e -> f s c e listBuiltinModules :: Casui s [CompiledModule] listBuiltinModules = do fmap (filter isBuiltIn . mlList . envModuleLibrary) env getModules :: Name -> Casui l [Module FullName Expression] getModules name = fmap (findModules name . envModuleLibrary) env type CompiledModule = Module FullName Expression