on master help sign in
Make Generate.JavaScript.Mode its own module
6d686c5Evan Czaplicki
compiler/src/Generate/JavaScript/Mode.hsnew file+94
@@ -0,0 +1,94 @@
1+module Generate.JavaScript.Mode
2+ ( Mode(..)
3+ , Target(..)
4+ , debug
5+ , dev
6+ , prod
7+ , isServer
8+ )
9+ where
10+
11+
12+import qualified Data.List as List
13+import qualified Data.Map as Map
14+
15+import qualified AST.Optimized as Opt
16+import qualified Elm.Interface as I
17+import qualified Elm.Name as N
18+import qualified Generate.JavaScript.Name as Name
19+
20+
21+
22+-- MODE
23+
24+
25+data Mode
26+ = Dev Target (Maybe I.Interfaces)
27+ | Prod Target ShortFieldNames
28+
29+
30+data Target = Client | Server
31+
32+
33+debug :: Target -> I.Interfaces -> Mode
34+debug target interfaces =
35+ Dev target (Just interfaces)
36+
37+
38+dev :: Target -> Mode
39+dev target =
40+ Dev target Nothing
41+
42+
43+prod :: Target -> Opt.Graph -> Mode
44+prod target (Opt.Graph _ _ fieldCounts) =
45+ Prod target (shortenFieldNames fieldCounts)
46+
47+
48+
49+-- IS SERVER?
50+
51+
52+isServer :: Mode -> Bool
53+isServer mode =
54+ case mode of
55+ Dev target _ -> isServerHelp target
56+ Prod target _ -> isServerHelp target
57+
58+
59+isServerHelp :: Target -> Bool
60+isServerHelp target =
61+ case target of
62+ Client -> False
63+ Server -> True
64+
65+
66+
67+-- SHORTEN FIELD NAMES
68+
69+
70+type ShortFieldNames =
71+ Map.Map N.Name Name.Name
72+
73+
74+shortenFieldNames :: Map.Map N.Name Int -> ShortFieldNames
75+shortenFieldNames frequencies =
76+ Map.foldr addToShortNames Map.empty $
77+ Map.foldrWithKey addToBuckets Map.empty frequencies
78+
79+
80+addToBuckets :: N.Name -> Int -> Map.Map Int [N.Name] -> Map.Map Int [N.Name]
81+addToBuckets field frequency buckets =
82+ -- TODO try using an IntMap for buckets
83+ Map.insertWith (++) frequency [field] buckets
84+
85+
86+addToShortNames :: [N.Name] -> ShortFieldNames -> ShortFieldNames
87+addToShortNames fields shortNames =
88+ List.foldl' addField shortNames fields
89+
90+
91+addField :: ShortFieldNames -> N.Name -> ShortFieldNames
92+addField shortNames field =
93+ let rename = Name.fromInt (Map.size shortNames) in
94+ Map.insert field rename shortNames
compiler/src/Generate/JavaScript/Name.hs−78
@@ -2,10 +2,6 @@
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.JavaScript.Name
3module Generate.JavaScript.Name
4 ( Name
4 ( Name
5− , Mode(..)
6− , Target(..)
7− , Debugger(..)
8− , isServer
9 , toBuilder
5 , toBuilder
10 , fromIndex
6 , fromIndex
11 , fromInt
7 , fromInt
@@ -13,22 +9,18 @@ module Generate.JavaScript.Name
13 , fromGlobal
9 , fromGlobal
14 , fromCycle
10 , fromCycle
15 , fromKernel
11 , fromKernel
16− , fromField
17 , makeF
12 , makeF
18 , makeA
13 , makeA
19 , makeLabel
14 , makeLabel
20 , makeTemp
15 , makeTemp
21 , dollar
16 , dollar
22− , shortenFieldNames
23 )
17 )
24 where
18 where
25
19
26
20
27import qualified Data.ByteString.Builder as B
21import qualified Data.ByteString.Builder as B
28import qualified Data.ByteString.Short as S
22import qualified Data.ByteString.Short as S
29−import qualified Data.List as List
30import Data.Monoid ((<>))
23import Data.Monoid ((<>))
31−import Data.Map ((!))
32import qualified Data.Map as Map
24import qualified Data.Map as Map
33import qualified Data.Set as Set
25import qualified Data.Set as Set
34import qualified Data.Text as Text
26import qualified Data.Text as Text
@@ -50,39 +42,6 @@ newtype Name =
50
42
51
43
52
44
53−-- MODE
54−
55−
56−data Mode
57− = Dev Target Debugger
58− | Prod Target ShortFieldNames
59−
60−
61−data Target = Client | Server
62−
63−
64−data Debugger
65− = DebuggerOn
66− | DebuggerOff
67−
68−
69−type ShortFieldNames =
70− Map.Map N.Name Name
71−
72−
73−isServer :: Mode -> Bool
74−isServer mode =
75− case mode of
76− Dev target _ -> isServerHelp target
77− Prod target _ -> isServerHelp target
78−
79−
80−isServerHelp :: Target -> Bool
81−isServerHelp target =
82− case target of { Client -> False ; Server -> True }
83−
84−
85−
86-- CONSTRUCTORS
45-- CONSTRUCTORS
87
46
88
47
@@ -127,16 +86,6 @@ fromKernel home name =
127 Name ("_" <> N.toBuilder home <> "_" <> N.toBuilder name)
86 Name ("_" <> N.toBuilder home <> "_" <> N.toBuilder name)
128
87
129
88
130−fromField :: Mode -> N.Name -> Name
131−fromField mode name =
132− case mode of
133− Dev _ _ ->
134− Name (N.toBuilder name)
135−
136− Prod _ fields ->
137− fields ! name
138−
139−
140
89
141-- TEMPORARY NAMES
90-- TEMPORARY NAMES
142
91
@@ -167,33 +116,6 @@ dollar =
167
116
168
117
169
118
170−-- SHORTEN FIELD NAMES
171−
172−
173−shortenFieldNames :: Map.Map N.Name Int -> ShortFieldNames
174−shortenFieldNames frequencies =
175− Map.foldr addToShortNames Map.empty $
176− Map.foldrWithKey addToBuckets Map.empty frequencies
177−
178−
179−addToBuckets :: N.Name -> Int -> Map.Map Int [N.Name] -> Map.Map Int [N.Name]
180−addToBuckets field frequency buckets =
181− -- TODO try using an IntMap for buckets
182− Map.insertWith (++) frequency [field] buckets
183−
184−
185−addToShortNames :: [N.Name] -> ShortFieldNames -> ShortFieldNames
186−addToShortNames fields shortNames =
187− List.foldl' addField shortNames fields
188−
189−
190−addField :: ShortFieldNames -> N.Name -> ShortFieldNames
191−addField shortNames field =
192− let rename = fromInt (Map.size shortNames) in
193− Map.insert field rename shortNames
194−
195−
196−
197-- RESERVED NAMES
119-- RESERVED NAMES
198
120
199
121
elm.cabal+1
@@ -167,6 +167,7 @@ Executable elm
167 Generate.JavaScript,
167 Generate.JavaScript,
168 Generate.JavaScript.Builder,
168 Generate.JavaScript.Builder,
169 Generate.JavaScript.Expression,
169 Generate.JavaScript.Expression,
170+ Generate.JavaScript.Mode,
170 Generate.JavaScript.Name,
171 Generate.JavaScript.Name,
171 Json.Decode.Error,
172 Json.Decode.Error,
172 Json.Decode.Internals,
173 Json.Decode.Internals,