@@ -10,7 +10,7 @@ import Data.Either (lefts,rights)
10import Data.List (intercalate,partition)
10import Data.List (intercalate,partition)
11import Parse.Parser (parseProgram, preParse)
11import Parse.Parser (parseProgram, preParse)
12import Rename
12import Rename
13−import Libraries (libraries)
13+import qualified Libraries as Libs
14import Types.Types ((-:))
14import Types.Types ((-:))
15import Types.Hints (hints)
15import Types.Hints (hints)
16import Types.Unify
16import Types.Unify
@@ -32,29 +32,30 @@ checkTypes modul =
32check :: Module -> Either String Module
32check :: Module -> Either String Module
33check = checkMistakes >=> checkTypes
33check = checkMistakes >=> checkTypes
35−buildFromSource :: String -> Either String Module
35+buildFromSource :: Bool -> String -> Either String Module
36−buildFromSource src = check =<< parseProgram src
36+buildFromSource withPrelude src = (check . add) =<< (parseProgram src)
37+ where add = if withPrelude then Libs.addPrelude else id
38−build :: FilePath -> IO (Either String [Module])
39+build :: Bool -> FilePath -> IO (Either String [Module])
39−build root = do
40+build withPrelude root = do
40 names <- getSortedModuleNames root
41 names <- getSortedModuleNames root
41 case names of
42 case names of
42 Left err -> return (Left err)
43 Left err -> return (Left err)
43 Right ns -> do srcs <- zipWithM buildFile' [1..] ns
44 Right ns -> do srcs <- zipWithM buildFile' [1..] ns
44 return (sequence srcs)
45 return (sequence srcs)
46− buildFile' n name = putStrLn (msg n name) >> buildFile name
47+ buildFile' n name = putStrLn (msg n name) >> buildFile withPrelude name
47 msg n name = "["++show n++" of "++show (length ns)++"] Compiling "++name
48 msg n name = "["++show n++" of "++show (length ns)++"] Compiling "++name
49−buildFile :: String -> IO (Either String Module)
50+buildFile :: Bool -> String -> IO (Either String Module)
50−buildFile moduleName =
51+buildFile withPrelude moduleName =
51 let filePath = toFilePath moduleName in
52 let filePath = toFilePath moduleName in
52 case isNative moduleName of
53 case isNative moduleName of
53 True -> return (Right $ Module [moduleName] [] [] [])
54 True -> return (Right $ Module [moduleName] [] [] [])
54 --return (Left "Can't do that yet")
55 --return (Left "Can't do that yet")
55 --Right `liftM` readFile filePath
56 --Right `liftM` readFile filePath
56 False -> do txt <- readFile filePath
57 False -> do txt <- readFile filePath
57− return $ buildFromSource txt
58+ return $ buildFromSource withPrelude txt
60getSortedModuleNames :: FilePath -> IO (Either String [String])
61getSortedModuleNames :: FilePath -> IO (Either String [String])
@@ -87,7 +88,7 @@ readDeps seen root = do
87 where realDeps = filter (`notElem` builtIns) deps
88 where realDeps = filter (`notElem` builtIns) deps
88 newDeps = filter (`notElem` seen) realDeps
89 newDeps = filter (`notElem` seen) realDeps
89 seen' = root : seen ++ newDeps
90 seen' = root : seen ++ newDeps
90− builtIns = Map.keys libraries
91+ builtIns = Map.keys Libs.libraries
92isNative name = takeWhile (/='.') name == "Native"
93isNative name = takeWhile (/='.') name == "Native"
93toFilePath name = map swapDots name ++ ext
94toFilePath name = map swapDots name ++ ext