on 2ec798e help sign in
elk/src/Elm/Compiler.hs
69 lines 1.9 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE FlexibleContexts #-}
3module Elm.Compiler
4 ( version
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
30-- DEPENDENCIES
32parseDependencies
33 :: (MonadError String m)
34 => String
35 -> m (PublicModule.Name, [PublicModule.Name])
36parseDependencies src =
37 case Help.iParse Parse.headerAndImports src of
38 Left msg ->
39 throwError (show msg)
41 Right (Module.HeaderAndImports names _exports imports) ->
42 return
43 ( PublicModule.Name names
44 , map (PublicModule.Name . fst) imports
45 )
48-- COMPILATION
50{-| Compiles Elm source code to JavaScript. -}
51compile
52 :: String
53 -> String
54 -> String
55 -> Map.Map PublicModule.Name PublicModule.Interface
56 -> Either String (PublicModule.Interface, String)
57compile user packageName source interfaces =
58 let unwrappedInterfaces =
59 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces
60 in
61 case Compile.compile user packageName unwrappedInterfaces source of
62 Right modul ->
63 Right (Module.toInterface modul, JS.generate modul)
65 Left docs ->
66 map P.render docs
67 |> List.intersperse ""
68 |> unlines
69 |> Left