on 2deedfb help sign in
elk/src/Elm/Header.hs
92 lines 1.7 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Header
3 ( Tag(..)
4 , parse
5 )
6 where
9import qualified Data.ByteString as B
11import qualified AST.Source as Src
12import qualified Elm.Compiler.Imports as Imports
13import qualified Elm.Compiler.Module as M
14import qualified Elm.Name as N
15import qualified Elm.Package as Pkg
16import qualified Parse.Primitives as Parser
17import qualified Parse.Module as Module
18import qualified Reporting.Annotation as A
19import qualified Reporting.Error as Error
23-- HEADER TAGS
26data Tag = Normal | Effect | Port
30-- PARSE
33parse :: Pkg.Name -> B.ByteString -> Either Error.Error (Maybe (Tag, M.Raw), [M.Raw])
34parse pkg sourceCode =
35 case Parser.run chompHeader sourceCode of
36 Right (Src.Module header imports _) ->
37 Right
38 ( fmap simplifyHeader header
39 , toDeps pkg imports
40 )
42 Left err ->
43 Left (Error.Syntax err)
46chompHeader :: Parser.Parser (Src.Module ())
47chompHeader =
48 Module.module_ $ return ()
52-- TO DEPS
55toDeps :: Pkg.Name -> [Src.Import] -> [N.Name]
56toDeps pkg imports =
57 if pkg == Pkg.core
58 then map getName imports
59 else map getName imports ++ defaultImports
62getName :: Src.Import -> N.Name
63getName (Src.Import (A.At _ name) _ _) =
64 name
67{-# NOINLINE defaultImports #-}
68defaultImports :: [N.Name]
69defaultImports =
70 map Imports._name Imports.defaults
74-- TO HEADER
77simplifyHeader :: Src.Header -> (Tag, N.Name)
78simplifyHeader (Src.Header name effects _ _) =
79 ( toTag effects, name )
82toTag :: Src.Effects -> Tag
83toTag effects =
84 case effects of
85 Src.NoEffects ->
86 Normal
88 Src.Ports _ ->
89 Port
91 Src.Manager _ _ ->
92 Effect