on fa264dd help sign in
elk/src/Elm/Compiler.hs
58 lines 1.7 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE FlexibleContexts #-}
3module Elm.Compiler (version, parseDependencies, compile) where
5import Control.Monad.Error (MonadError, MonadIO, liftIO, throwError)
6import qualified Data.List as List
7import qualified Data.Map as Map
8import qualified Text.PrettyPrint as P
10import qualified AST.Module as Module (HeaderAndImports(HeaderAndImports), Interfaces, toInterface)
11import qualified Build.Source as Source
12import qualified Elm.Compiler.Module as PublicModule
13import qualified Elm.Compiler.Version as Version
14import qualified Generate.JavaScript as JS
15import qualified Metadata.Prelude as Prelude
16import qualified Parse.Helpers as Help
17import qualified Parse.Module as Parse
20-- VERSION
22version :: String
23version =
24 Version.version
27-- DEPENDENCIES
29parseDependencies
30 :: (MonadError String m)
31 => String
32 -> m (PublicModule.Name, [PublicModule.Name])
33parseDependencies src =
34 case Help.iParse Parse.headerAndImports src of
35 Left msg ->
36 throwError (show msg)
38 Right (Module.HeaderAndImports names _exports imports) ->
39 return
40 ( PublicModule.Name names
41 , map (PublicModule.Name . fst) imports
42 )
45-- COMPILATION
47{-| Compiles Elm source code to JavaScript. -}
48compile
49 :: String
50 -> Map.Map PublicModule.Name PublicModule.Interface
51 -> Either String PublicModule.Interface
52compile source interfaces =
53 case Source.build True unwrappedInterfaces source of
54 Left docs -> Left . unlines . List.intersperse "" $ map P.render docs
55 Right modul -> Right (Module.toInterface modul)
56 where
57 unwrappedInterfaces =
58 Map.mapKeysMonotonic (\(PublicModule.Name name) -> name) interfaces