packages feed

casui-0.3: Casui/Compile.hs

{-# 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