on master help sign in
Remove Elm.Name and switch elm.cabal file to new name format

Compared to the 0.19 release when compiling elm-spa example from scratch on my computer, this does 17% less allocation and total time goes from 0.45 to 0.38 (~15%) Being able to customize the binary serialization format also means that elmi, elmo, and dat files are a decent bit smaller. No more using Word64 for the length of variables like “a” and “test” Need to do some testing with larger codebases to see how this extends though.

commit77bac8f330d6a5cb7513ab346a5d65c028dfd1c4 authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 19 Nov 2018, 14:17 (8 years ago) parent541409c
2 files changed+1−343
compiler/src/Elm/Name.hs−342 elm.cabal+1−1
compiler/src/Elm/Name.hsdeleted−342
@@ -1,342 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−module Elm.Name
4− ( Name
5− -- utilities
6− , length
7− , contains
8− , startsWith
9− , drop
10− -- conversions
11− , toText
12− , toString
13− , toBuilder
14− , toDotlessBuilder
15− , toShort
16− -- helpers
17− , addIndex
18− , addSafeIndex
19− , toCompositeName
20− , sepBy
21− -- create
22− , fromForeignPtr
23− , fromString
24− , fromLetter
25− , fromText
26− -- interned
27− , int, float, bool, char, string
28− , maybe, result, list, array, dict, tuple, jsArray
29− , task, router, cmd, sub, platform, virtualDom
30− , shader, debug, debugger, bitwise, basics
31− , utils, negate, true, false, value
32− , node, program, main, dollar, identity
33− , replModule
34− )
35− where
36−
37−
38−import Prelude hiding (drop, length, maybe, negate)
39−import Data.Binary
40−import qualified Data.ByteString.Builder as B
41−import qualified Data.ByteString.Internal as B
42−import qualified Data.ByteString.Short as S
43−import qualified Data.Char as Char
44−import qualified Data.String as String
45−import qualified Data.Text as Text
46−import qualified Data.Text.Encoding as Text
47−import Data.Word (Word8)
48−import Foreign.ForeignPtr (ForeignPtr)
49−
50−
51−
52−-- NAME
53−
54−
55−newtype Name = Name { _name :: Text.Text }
56− deriving (Eq, Ord)
57−
58−
59−length :: Name -> Int
60−length (Name name) =
61− Text.length name
62−
63−
64−contains :: Word8 -> Name -> Bool
65−contains word (Name name) =
66− Text.isInfixOf (Text.singleton (Char.chr (fromIntegral word))) name
67−
68−
69−startsWith :: Name -> Name -> Bool
70−startsWith (Name prefix) (Name name) =
71− Text.isPrefixOf prefix name
72−
73−
74−drop :: Int -> Name -> Name
75−drop numBytes (Name name) =
76− Name (Text.drop numBytes name)
77−
78−
79−
80−-- CONVERSIONS
81−
82−
83−toText :: Name -> Text.Text
84−toText (Name name) =
85− name
86−
87−
88−toString :: Name -> String
89−toString (Name name) =
90− Text.unpack name
91−
92−
93−toBuilder :: Name -> B.Builder
94−toBuilder (Name name) =
95− Text.encodeUtf8Builder name
96−
97−
98−toDotlessBuilder :: Name -> B.Builder
99−toDotlessBuilder (Name name) =
100− Text.encodeUtf8Builder (Text.replace "." "$" name)
101−
102−
103−toShort :: Name -> S.ShortByteString
104−toShort (Name name) =
105− S.toShort (Text.encodeUtf8 name)
106−
107−
108−addIndex :: Name -> Int -> Name
109−addIndex (Name name) index =
110− Name (Text.append name (Text.pack (show index)))
111−
112−
113−addSafeIndex :: Name -> Int -> Name
114−addSafeIndex (Name name) index =
115− Name $ Text.append name $ Text.pack $
116− if Char.isDigit (Text.last name) then
117− '_' : show index
118− else
119− show index
120−
121−
122−toCompositeName :: [Name] -> Name
123−toCompositeName names =
124− Name (Text.cons '$' (Text.intercalate "$" (map _name names)))
125−
126−
127−sepBy :: Word8 -> Name -> Name -> Name
128−sepBy sep (Name home) (Name name) =
129− Name (Text.concat [ home, Text.singleton (Char.chr (fromIntegral sep)), name ])
130−
131−
132−
133−-- CREATE NAMES
134−
135−
136−fromForeignPtr :: ForeignPtr Word8 -> Int -> Int -> Name
137−fromForeignPtr fptr offset len =
138− Name (Text.decodeUtf8 (B.PS fptr offset len))
139−
140−
141−fromString :: String -> Name
142−fromString str =
143− Name (Text.pack str)
144−
145−
146−{- Takes a letter from 0 to 25 -}
147−fromLetter :: Int -> Name
148−fromLetter letter =
149− Name (Text.singleton (Char.chr (97 + letter)))
150−
151−
152−fromText :: Text.Text -> Name
153−fromText =
154− Name
155−
156−
157−
158−-- INSTANCES
159−
160−
161−instance String.IsString Name where
162− fromString str =
163− Name (Text.pack str)
164−
165−
166−instance Binary Name where
167− put (Name name) = put name
168− get = Name <$> get
169−
170−
171−
172−-- COMMON NAMES
173−
174−
175−{-# NOINLINE int #-}
176−int :: Name
177−int = "Int"
178−
179−
180−{-# NOINLINE float #-}
181−float :: Name
182−float = "Float"
183−
184−
185−{-# NOINLINE bool #-}
186−bool :: Name
187−bool = "Bool"
188−
189−
190−{-# NOINLINE char #-}
191−char :: Name
192−char = "Char"
193−
194−
195−{-# NOINLINE string #-}
196−string :: Name
197−string = "String"
198−
199−
200−{-# NOINLINE maybe #-}
201−maybe :: Name
202−maybe = "Maybe"
203−
204−
205−{-# NOINLINE result #-}
206−result :: Name
207−result = "Result"
208−
209−
210−{-# NOINLINE list #-}
211−list :: Name
212−list = "List"
213−
214−
215−{-# NOINLINE array #-}
216−array :: Name
217−array = "Array"
218−
219−
220−{-# NOINLINE dict #-}
221−dict :: Name
222−dict = "Dict"
223−
224−
225−{-# NOINLINE tuple #-}
226−tuple :: Name
227−tuple = "Tuple"
228−
229−
230−{-# NOINLINE jsArray #-}
231−jsArray :: Name
232−jsArray = "JsArray"
233−
234−
235−{-# NOINLINE task #-}
236−task :: Name
237−task = "Task"
238−
239−
240−{-# NOINLINE router #-}
241−router :: Name
242−router = "Router"
243−
244−
245−{-# NOINLINE cmd #-}
246−cmd :: Name
247−cmd = "Cmd"
248−
249−
250−{-# NOINLINE sub #-}
251−sub :: Name
252−sub = "Sub"
253−
254−
255−{-# NOINLINE platform #-}
256−platform :: Name
257−platform = "Platform"
258−
259−
260−{-# NOINLINE virtualDom #-}
261−virtualDom :: Name
262−virtualDom = "VirtualDom"
263−
264−
265−{-# NOINLINE shader #-}
266−shader :: Name
267−shader = "Shader"
268−
269−
270−{-# NOINLINE debug #-}
271−debug :: Name
272−debug = "Debug"
273−
274−
275−{-# NOINLINE debugger #-}
276−debugger :: Name
277−debugger = "Debugger"
278−
279−
280−{-# NOINLINE bitwise #-}
281−bitwise :: Name
282−bitwise = "Bitwise"
283−
284−
285−{-# NOINLINE basics #-}
286−basics :: Name
287−basics = "Basics"
288−
289−
290−{-# NOINLINE utils #-}
291−utils :: Name
292−utils = "Utils"
293−
294−
295−{-# NOINLINE negate #-}
296−negate :: Name
297−negate = "negate"
298−
299−
300−{-# NOINLINE true #-}
301−true :: Name
302−true = "True"
303−
304−
305−{-# NOINLINE false #-}
306−false :: Name
307−false = "False"
308−
309−
310−{-# NOINLINE value #-}
311−value :: Name
312−value = "Value"
313−
314−
315−{-# NOINLINE node #-}
316−node :: Name
317−node = "Node"
318−
319−
320−{-# NOINLINE program #-}
321−program :: Name
322−program = "Program"
323−
324−
325−{-# NOINLINE main #-}
326−main :: Name
327−main = "main"
328−
329−
330−{-# NOINLINE dollar #-}
331−dollar :: Name
332−dollar = "$"
333−
334−
335−{-# NOINLINE identity #-}
336−identity :: Name
337−identity = "identity"
338−
339−
340−{-# NOINLINE replModule #-}
341−replModule :: Name
342−replModule = "Elm_Repl"
elm.cabal+1−1
@@ -136,7 +136,6 @@ Executable elm
136136 Elm.Docs
137137 Elm.Kernel
138138 Elm.Header
139− Elm.Name
140139 Elm.Package
141140 Json.Decode
142141 Json.Encode
@@ -162,6 +161,7 @@ Executable elm
162161 Compile
163162 Data.Bag
164163 Data.Index
164+ Data.Name
165165 Data.OneOrMore
166166 Data.Utf8
167167 Elm.Compiler.Imports