packages feed

casui-0.3: Casui/Casui.hs

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