packages feed

casui-0.3: Casui/Module.hs

module Casui.Module where

import Casui.Name
import Casui.Value
import Casui.Utils

import Control.Monad

data ModuleList val = ModuleList { mlList :: [Module FullName val] }

data Module name val = Module {
  mFullName :: FullName,
  mImports :: [name],
  mDefines :: [(Symbol, Maybe val)],
  mProperties :: [(name, Property name val)]
  }
                       

type ModuleLibrary = ModuleList Expression

isBuiltIn :: Module FullName v -> Bool
isBuiltIn (mFullName -> FullName Builtin _) = True
isBuiltIn _ = False


findModules :: Name -> ModuleLibrary -> [Module FullName Expression]
findModules n (ModuleList l) = filter (matchName n . mFullName) l

resolveName :: Name -> ModuleList Expression -> Maybe FullName
resolveName (Name (reverse -> (name:(reverse -> path)))) modlist =
  foldl mplus Nothing $
  map (lookup name) $
  map (\m -> map (flip (,) (mFullName m) . fst) (mDefines m)) $
  findModules (Name path) modlist