on 0d89d62 help sign in
elk/src/Elm/Compiler/Module.hs
144 lines 3.1 kB history raw
1module Elm.Compiler.Module
2 ( Interface, Name(Name), name
3 , CanonicalName(CanonicalName), canonicalName, canonPkg, canonModul, fromCanonicalName
4 , nameToPath
5 , nameToString, nameFromString
6 , hyphenate, dehyphenate
7 , defaultImports
8 , interfacePorts
9 , interfaceAliasedTypes
10 )
11 where
13import Control.Monad (mzero)
14import qualified Data.Aeson as Json
15import Data.Binary
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 System.FilePath ((</>))
22import qualified AST.Module as Module
23import qualified Elm.Compiler.Imports as Imports
24import qualified Elm.Compiler.Type as Type
25import qualified Elm.Compiler.Type.Extract as Extract
26import qualified Elm.Package as Package
29-- EXPOSED TYPES
31type Interface = Module.Interface
34newtype Name = Name [String]
35 deriving (Eq, Ord)
37data CanonicalName =
38 CanonicalName
39 { canonPkg :: Package.Name
40 , canonModul :: Name
41 }
44fromCanonicalName :: CanonicalName -> Module.CanonicalName
45fromCanonicalName (CanonicalName p (Name n)) =
46 Module.CanonicalName p n
49canonicalName :: Package.Name -> Name -> CanonicalName
50canonicalName = CanonicalName
53name :: [String] -> Name
54name = Name
57defaultImports :: [Name]
58defaultImports =
59 map (Name . fst) Imports.defaults
62-- POKING AROUND INTERFACES
64interfacePorts :: Interface -> [String]
65interfacePorts interface =
66 Module.iPorts interface
69interfaceAliasedTypes :: Interface -> Map.Map String Type.Type
70interfaceAliasedTypes interface =
71 Map.map Extract.toAliasedType (Module.iTypes interface)
74-- STRING CONVERSIONS for NAMES
76nameToPath :: Name -> FilePath
77nameToPath (Name names) =
78 List.foldl1 (</>) names
81nameToString :: Name -> String
82nameToString (Name names) =
83 List.intercalate "." names
86nameFromString :: String -> Maybe Name
87nameFromString =
88 fromString '.'
91hyphenate :: Name -> String
92hyphenate (Name names) =
93 List.intercalate "-" names
96dehyphenate :: String -> Maybe Name
97dehyphenate =
98 fromString '-'
101fromString :: Char -> String -> Maybe Name
102fromString sep raw =
103 Name `fmap` mapM isLegit names
104 where
105 names =
106 filter (/= [sep]) (List.groupBy (\a b -> a /= sep && b /= sep) raw)
108 isLegit name =
109 case name of
110 [] -> Nothing
111 char:rest ->
112 if Char.isUpper char && all legitChar rest
113 then Just name
114 else Nothing
116 legitChar char =
117 Char.isAlphaNum char || char `elem` "_'"
120-- JSON for NAME
122instance Json.ToJSON Name where
123 toJSON name =
124 Json.toJSON (nameToString name)
127instance Json.FromJSON Name where
128 parseJSON (Json.String text) =
129 let rawName = Text.unpack text in
130 case nameFromString rawName of
131 Nothing -> fail (rawName ++ " is not a valid module name")
132 Just name -> return name
134 parseJSON _ = mzero
137-- BINARY for NAME
139instance Binary Name where
140 get =
141 fmap Name get
143 put (Name names) =
144 put names