on 21ccfbc help sign in
elk/src/Elm/Compiler.hs
74 lines 1.9 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE FlexibleContexts #-}
3module Elm.Compiler
4 ( version, rawVersion
5 , parseDependencies, compile
6 ) where
8import Control.Monad.Error (MonadError, throwError)
9import qualified Data.List as List
10import qualified Data.Map as Map
11import qualified Text.PrettyPrint as P
13import qualified AST.Module as Module (HeaderAndImports(HeaderAndImports), toInterface)
14import qualified Compile
15import qualified Elm.Compiler.Module as PublicModule
16import qualified Elm.Compiler.Version as Version
17import Elm.Utils ((|>))
18import qualified Generate.JavaScript as JS
19import qualified Parse.Helpers as Help
20import qualified Parse.Module as Parse
23-- VERSION
25version :: String
26version =
27 Version.version
30rawVersion :: [Int]
31rawVersion =
32 Version.rawVersion
35-- DEPENDENCIES
37parseDependencies
38 :: (MonadError String m)
39 => String
40 -> m (PublicModule.Name, [PublicModule.Name])
41parseDependencies src =
42 case Help.iParse Parse.headerAndImports src of
43 Left msg ->
44 throwError (show msg)
46 Right (Module.HeaderAndImports names _exports imports) ->
47 return
48 ( PublicModule.Name names
49 , map (PublicModule.Name . fst) imports
50 )
53-- COMPILATION
55{-| Compiles Elm source code to JavaScript. -}
56compile
57 :: String
58 -> String
59 -> String
60 -> Map.Map PublicModule.Name PublicModule.Interface
61 -> Either String (PublicModule.Interface, String)
62compile user packageName source interfaces =
63 let unwrappedInterfaces =
64 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
65 in
66 case Compile.compile user packageName unwrappedInterfaces source of
67 Right modul ->
68 Right (Module.toInterface modul, JS.generate modul)
70 Left docs ->
71 map P.render docs
72 |> List.intersperse ""
73 |> unlines
74 |> Left