@@ -13,9 +13,9 @@
14-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
16−{-# LANGUAGE DataKinds #-}
16+{-# LANGUAGE DataKinds, QuasiQuotes, TemplateHaskell #-}
18−module Language.PureScript (module P, compile, compile', MonadMake(..), make, preludeFilename) where
18+module Language.PureScript (module P, compile, compile', MonadMake(..), make, prelude) where
20import Language.PureScript.Types as P
20import Language.PureScript.Types as P
21import Language.PureScript.Kinds as P
21import Language.PureScript.Kinds as P
@@ -36,21 +36,22 @@ import Language.PureScript.Supply as P
36import Language.PureScript.Renamer as P
36import Language.PureScript.Renamer as P
38import qualified Language.PureScript.Constants as C
38import qualified Language.PureScript.Constants as C
39−import qualified Paths_purescript as Paths
41import Data.List (sortBy, groupBy, intercalate)
40import Data.List (sortBy, groupBy, intercalate)
42import Data.Time.Clock
41import Data.Time.Clock
43import Data.Function (on)
42import Data.Function (on)
44import Data.Maybe (fromMaybe)
43import Data.Maybe (fromMaybe)
44+import Data.FileEmbed (embedFile)
45import Control.Monad.Error
46import Control.Monad.Error
46import Control.Arrow ((&&&))
47import Control.Arrow ((&&&))
47import Control.Applicative
48import Control.Applicative
48import qualified Data.Map as M
50import qualified Data.Map as M
49import qualified Data.Set as S
51import qualified Data.Set as S
52+import qualified Data.ByteString.UTF8 as BU
51−import System.FilePath ((</>), pathSeparator, takeDirectory)
54+import System.FilePath ((</>))
52−import System.Directory (getAppUserDataDirectory, doesFileExist)
53−import System.Environment (getProgName)
56-- Compile a collection of modules
57-- Compile a collection of modules
@@ -146,8 +147,8 @@ make outputDir opts ms prefix = do
146 toRebuild <- foldM (\s (Module moduleName' _ _) -> do
147 toRebuild <- foldM (\s (Module moduleName' _ _) -> do
147 let filePath = runModuleName moduleName'
148 let filePath = runModuleName moduleName'
149− jsFile = outputDir ++ pathSeparator : filePath ++ pathSeparator : "index.js"
150+ jsFile = outputDir </> filePath </> "index.js"
150− externsFile = outputDir ++ pathSeparator : filePath ++ pathSeparator : "externs.purs"
151+ externsFile = outputDir </> filePath </> "externs.purs"
151 inputFile = fromMaybe (error "Input file is undefined in make") $ M.lookup moduleName' filePathMap
152 inputFile = fromMaybe (error "Input file is undefined in make") $ M.lookup moduleName' filePathMap
153 jsTimestamp <- getTimestamp jsFile
154 jsTimestamp <- getTimestamp jsFile
@@ -173,8 +174,8 @@ make outputDir opts ms prefix = do
173 go env' ms'
174 go env' ms'
174 go env ((True, m@(Module moduleName' _ exps)) : ms') = do
175 go env ((True, m@(Module moduleName' _ exps)) : ms') = do
175 let filePath = runModuleName moduleName'
176 let filePath = runModuleName moduleName'
176− jsFile = outputDir ++ pathSeparator : filePath ++ pathSeparator : "index.js"
177+ jsFile = outputDir </> filePath </> "index.js"
177− externsFile = outputDir ++ pathSeparator : filePath ++ pathSeparator : "externs.purs"
178+ externsFile = outputDir </> filePath </> "externs.purs"
179 lift . progress $ "Compiling " ++ runModuleName moduleName'
180 lift . progress $ "Compiling " ++ runModuleName moduleName'
@@ -201,7 +202,7 @@ make outputDir opts ms prefix = do
201 toRebuild' = toRebuild `S.union` S.fromList deps
202 toRebuild' = toRebuild `S.union` S.fromList deps
202 (:) (True, m) <$> rebuildIfNecessary graph toRebuild' ms'
203 (:) (True, m) <$> rebuildIfNecessary graph toRebuild' ms'
203 rebuildIfNecessary graph toRebuild (Module moduleName' _ _ : ms') = do
204 rebuildIfNecessary graph toRebuild (Module moduleName' _ _ : ms') = do
204− let externsFile = outputDir ++ pathSeparator : runModuleName moduleName' ++ pathSeparator : "externs.purs"
205+ let externsFile = outputDir </> runModuleName moduleName' </> "externs.purs"
205 externs <- readTextFile externsFile
206 externs <- readTextFile externsFile
206 externsModules <- liftError . either (Left . show) Right $ P.runIndentParser externsFile P.parseModules externs
207 externsModules <- liftError . either (Left . show) Right $ P.runIndentParser externsFile P.parseModules externs
207 case externsModules of
208 case externsModules of
@@ -232,21 +233,5 @@ importPrim = addDefaultImport (ModuleName [ProperName C.prim])
232importPrelude :: Module -> Module
233importPrelude :: Module -> Module
233importPrelude = addDefaultImport (ModuleName [ProperName C.prelude])
234importPrelude = addDefaultImport (ModuleName [ProperName C.prelude])
235−preludeFilename :: IO FilePath
236+prelude :: String
236−preludeFilename = do
237+prelude = BU.toString $(embedFile "prelude/prelude.purs")
237− fs <- sequence [localPrelude, appPrelude, cabalPrelude]
238− es <- filterM doesFileExist fs
241− _ -> error "No Prelude found."
243− localPrelude :: IO FilePath
244− localPrelude = ((</> "prelude.purs") . takeDirectory) <$> getProgName
246− appPrelude :: IO FilePath
248− appDir <- getAppUserDataDirectory "purescript"
249− return $ appDir </> "prelude" </> "prelude.purs"
251− cabalPrelude :: IO FilePath
252− cabalPrelude = Paths.getDataFileName "prelude/prelude.purs"