on 8a89c86 help sign in
elk/src/Elm/Compiler/Module.hs
136 lines 2.6 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Elm.Compiler.Module
4 -- interfaces
5 ( Module.Interface
6 , Module.Interfaces
7 , Module.privatize
8 , interfaceAliasedTypes
9 , programTypes
11 -- module names
12 , ModuleName.Raw
13 , nameToPath
14 , nameToString
15 , nameFromText
16 , hyphenate
17 , dehyphenate
18 , encode
19 , decoder
21 -- canonical names
22 , ModuleName.Canonical(..)
23 , canonicalToMain
24 )
25 where
27import qualified Data.Char as Char
28import qualified Data.List as List
29import qualified Data.Map as Map
30import qualified Data.Text as Text
31import Data.Text (Text)
32import System.FilePath ((</>))
34import qualified AST.Module as Module
35import qualified AST.Module.Name as ModuleName
36import qualified Elm.Compiler.Type as PublicType
37import qualified Elm.Compiler.Type.Extract as Extract
38import qualified Generate.JavaScript.Variable as JS
39import qualified Json.Decode as Decode
40import qualified Json.Encode as Encode
44-- INTERFACES
47interfaceAliasedTypes :: Module.Interface -> Map.Map Text PublicType.Type
48interfaceAliasedTypes interface =
49 Map.map Extract.extract (Module.iTypes interface)
52programTypes :: Module.Interfaces -> ModuleName.Canonical -> Maybe PublicType.Program
53programTypes =
54 Extract.extractProgram
58-- NAMES
61nameToPath :: ModuleName.Raw -> FilePath
62nameToPath name =
63 List.foldl1 (</>) (map Text.unpack (Text.splitOn "." name))
66nameToString :: ModuleName.Raw -> String
67nameToString name =
68 Text.unpack name
71nameFromText :: Text -> Maybe ModuleName.Raw
72nameFromText =
73 fromText '.'
76hyphenate :: ModuleName.Raw -> Text
77hyphenate name =
78 Text.replace "." "-" name
81dehyphenate :: Text -> Maybe ModuleName.Raw
82dehyphenate =
83 fromText '-'
86fromText :: Char -> Text -> Maybe ModuleName.Raw
87fromText sep name =
88 let
89 chunks =
90 Text.splitOn (Text.singleton sep) name
91 in
92 if all isGoodChunk chunks then Just name else Nothing
95isGoodChunk :: Text -> Bool
96isGoodChunk chunk =
97 case Text.uncons chunk of
98 Nothing ->
99 False
101 Just (first, rest) ->
102 Char.isUpper first && Text.all isGoodChar rest
105isGoodChar :: Char -> Bool
106isGoodChar char =
107 Char.isAlphaNum char || char == '_'
111-- JSON
114encode :: ModuleName.Raw -> Encode.Value
115encode =
116 Encode.text
119decoder :: Decode.Decoder ModuleName.Raw
120decoder =
121 do txt <- Decode.text
122 case nameFromText txt of
123 Nothing ->
124 Decode.fail "Expecting a module name like \"Html.Events\""
126 Just name ->
127 Decode.succeed name
131-- CANONICAL TO MAIN
134canonicalToMain :: ModuleName.Canonical -> Text
135canonicalToMain home =
136 JS.globalToName home "main"