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