on master help sign in
Add code for shortening filed names based on frequency
755239cEvan Czaplicki
src/Generate/JavaScript/Name.hs+55−5
@@ -3,6 +3,8 @@
3module Generate.JavaScript.Name
3module Generate.JavaScript.Name
4 ( Name
4 ( Name
5 , Mode(..)
5 , Mode(..)
6+ , Target(..)
7+ , isServer
6 , toBuilder
8 , toBuilder
7 , fromInt
9 , fromInt
8 , fromLocal
10 , fromLocal
@@ -13,12 +15,14 @@ module Generate.JavaScript.Name
13 , makeLabel
15 , makeLabel
14 , makeTemp
16 , makeTemp
15 , dollar
17 , dollar
18+ , shortenFieldNames
16 )
19 )
17 where
20 where
18
21
19
22
20import qualified Data.ByteString.Builder as B
23import qualified Data.ByteString.Builder as B
21import qualified Data.ByteString.Short as S
24import qualified Data.ByteString.Short as S
25+import qualified Data.List as List
22import Data.Monoid ((<>))
26import Data.Monoid ((<>))
23import Data.Map ((!))
27import Data.Map ((!))
24import qualified Data.Map as Map
28import qualified Data.Map as Map
@@ -45,8 +49,27 @@ newtype Name =
45
49
46
50
47data Mode
51data Mode
48− = Debug
52+ = Debug Target
53+ | Prod Target ShortFieldNames
54+
55+
56+data Target = Client | Server
57+
58+
59+type ShortFieldNames =
49− | Prod (Map.Map N.Name B.Builder)
60+ Map.Map N.Name Name
61+
62+
63+isServer :: Mode -> Bool
64+isServer mode =
65+ case mode of
66+ Debug target -> isServerHelp target
67+ Prod target _ -> isServerHelp target
68+
69+
70+isServerHelp :: Target -> Bool
71+isServerHelp target =
72+ case target of { Client -> False ; Server -> True }
50
73
51
74
52
75
@@ -92,11 +115,11 @@ fromKernel home name =
92fromField :: Mode -> N.Name -> Name
115fromField :: Mode -> N.Name -> Name
93fromField mode name =
116fromField mode name =
94 case mode of
117 case mode of
95− Debug ->
118+ Debug _ ->
96 Name (N.toBuilder name)
119 Name (N.toBuilder name)
97
120
98− Prod fields ->
121+ Prod _ fields ->
99− Name (fields ! name)
122+ fields ! name
100
123
101
124
102
125
@@ -119,6 +142,33 @@ dollar =
119
142
120
143
121
144
145+-- SHORTEN FIELD NAMES
146+
147+
148+shortenFieldNames :: Map.Map N.Name Int -> ShortFieldNames
149+shortenFieldNames frequencies =
150+ Map.foldr addToShortNames Map.empty $
151+ Map.foldrWithKey addToBuckets Map.empty frequencies
152+
153+
154+addToBuckets :: N.Name -> Int -> Map.Map Int [N.Name] -> Map.Map Int [N.Name]
155+addToBuckets field frequency buckets =
156+ -- TODO try using an IntMap for buckets
157+ Map.insertWith (++) frequency [field] buckets
158+
159+
160+addToShortNames :: [N.Name] -> ShortFieldNames -> ShortFieldNames
161+addToShortNames fields shortNames =
162+ List.foldl' addField shortNames fields
163+
164+
165+addField :: ShortFieldNames -> N.Name -> ShortFieldNames
166+addField shortNames field =
167+ let rename = fromInt (Map.size shortNames) in
168+ Map.insert field rename shortNames
169+
170+
171+
122-- RESERVED NAMES
172-- RESERVED NAMES
123
173
124
174