{-# LANGUAGE ScopedTypeVariables #-} module Casui.Extend where import Casui.Name import Casui.Utils import Casui.Value import Casui.Module import Casui.Parse import Casui.Casui import Data.Either import Control.Monad type CompileModuleResult = Either (TagError [(ParsedName, [FullName])]) compileModule :: Module ParsedName ParsedValue -> Casui s (CompileModuleResult CompiledModule) compileModule mod = do elist <- listModuleImports mod flip (either (return . Left)) elist $ \mlist -> do ctx <- return . Context [] . ModuleList . (mlist ++) =<< listBuiltinModules withContext ctx $ do return undefined listModuleImports :: ParsedModule -> Casui s (CompileModuleResult [CompiledModule]) listModuleImports mod = do (imps :: [Either (ParsedName, [FullName]) CompiledModule]) <- forM (mImports mod) $ \pn@(ParsedName loc name) -> do ms <- getModules name return $ case ms of [m] -> Right $ m l -> Left $ (pn, map mFullName l) case imps of (lefts -> l@(_:_)) -> return $ Left $ err "Error finding imports" l (rights -> l) -> return $ Right $ l