@@ -3,6 +3,8 @@
33module Generate.JavaScript.Name
44 ( Name
55 , Mode(..)
6+ , Target(..)
7+ , isServer
68 , toBuilder
79 , fromInt
810 , fromLocal
@@ -13,12 +15,14 @@ module Generate.JavaScript.Name
1315 , makeLabel
1416 , makeTemp
1517 , dollar
18+ , shortenFieldNames
1619 )
1720 where
1821
1922
2023import qualified Data.ByteString.Builder as B
2124import qualified Data.ByteString.Short as S
25+import qualified Data.List as List
2226import Data.Monoid ((<>))
2327import Data.Map ((!))
2428import qualified Data.Map as Map
@@ -45,8 +49,27 @@ newtype Name =
4549
4650
4751data Mode
48− = Debug
49− | Prod (Map.Map N.Name B.Builder)
52+ = Debug Target
53+ | Prod Target ShortFieldNames
54+
55+
56+data Target = Client | Server
57+
58+
59+type ShortFieldNames =
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 }
5073
5174
5275
@@ -92,11 +115,11 @@ fromKernel home name =
92115fromField :: Mode -> N.Name -> Name
93116fromField mode name =
94117 case mode of
95− Debug ->
118+ Debug _ ->
96119 Name (N.toBuilder name)
97120
98− Prod fields ->
99− Name (fields ! name)
121+ Prod _ fields ->
122+ fields ! name
100123
101124
102125
@@ -119,6 +142,33 @@ dollar =
119142
120143
121144
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+
122172-- RESERVED NAMES
123173
124174