on e8bc65e help sign in
elk/src/Elm/Compiler/Module.hs
140 lines 2.8 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Elm.Compiler.Module
4 ( Interface, Interfaces
5 , ModuleName.Raw
6 , nameToPath
7 , nameToString, nameFromText
8 , hyphenate, dehyphenate
9 , RawForJson(RawForJson), fromJson
10 , interfaceAliasedTypes, programTypes
11 , ModuleName.Canonical(..), qualifiedVar
12 )
13 where
15import qualified Data.Aeson as Json
16import qualified Data.Char as Char
17import qualified Data.List as List
18import qualified Data.Map as Map
19import qualified Data.Text as Text
20import Data.Text (Text)
21import System.FilePath ((</>))
23import qualified AST.Module as Module
24import qualified AST.Module.Name as ModuleName
25import qualified Elm.Compiler.Type as PublicType
26import qualified Elm.Compiler.Type.Extract as Extract
27import qualified Generate.JavaScript.Variable as Gen
31-- INTERFACES
34type Interface = Module.Interface
37type Interfaces = Module.Interfaces
40interfaceAliasedTypes :: Interface -> Map.Map Text PublicType.Type
41interfaceAliasedTypes interface =
42 Map.map Extract.extract (Module.iTypes interface)
45programTypes :: Interfaces -> ModuleName.Canonical -> Maybe PublicType.Program
46programTypes =
47 Extract.extractProgram
51-- NAMES
54newtype RawForJson = RawForJson ModuleName.Raw
57fromJson :: RawForJson -> ModuleName.Raw
58fromJson (RawForJson raw) =
59 raw
62qualifiedVar :: ModuleName.Canonical -> Text -> Text
63qualifiedVar =
64 Gen.qualified
68-- STRING CONVERSIONS for RAW NAMES
71nameToPath :: ModuleName.Raw -> FilePath
72nameToPath name =
73 List.foldl1 (</>) (map Text.unpack (Text.splitOn "." name))
76nameToString :: ModuleName.Raw -> String
77nameToString name =
78 Text.unpack name
81nameFromText :: Text -> Maybe ModuleName.Raw
82nameFromText =
83 fromText '.'
86hyphenate :: ModuleName.Raw -> Text
87hyphenate name =
88 Text.replace "." "-" name
91dehyphenate :: Text -> Maybe ModuleName.Raw
92dehyphenate =
93 fromText '-'
96fromText :: Char -> Text -> Maybe ModuleName.Raw
97fromText sep name =
98 let
99 chunks =
100 Text.splitOn (Text.singleton sep) name
101 in
102 if all isGoodChunk chunks then Just name else Nothing
105isGoodChunk :: Text -> Bool
106isGoodChunk chunk =
107 case Text.uncons chunk of
108 Nothing ->
109 False
111 Just (first, rest) ->
112 Char.isUpper first && Text.all isGoodChar rest
115isGoodChar :: Char -> Bool
116isGoodChar char =
117 Char.isAlphaNum char || char == '_'
121-- JSON for NAME
124instance Json.ToJSON RawForJson where
125 toJSON (RawForJson name) =
126 Json.toJSON (nameToString name)
129instance Json.FromJSON RawForJson where
130 parseJSON (Json.String text) =
131 case nameFromText text of
132 Nothing ->
133 fail (Text.unpack text ++ " is not a valid module name")
135 Just name ->
136 return (RawForJson name)
138 parseJSON _ =
139 fail "expecting the module name to be a string"