on master help sign in
Use bytestring builders to generate JS
abd5880Evan Czaplicki
src/Elm/Compiler.hs+2−2
@@ -11,8 +11,8 @@ module Elm.Compiler
11
11
12import qualified Data.Aeson as Json
12import qualified Data.Aeson as Json
13import qualified Data.Map as Map
13import qualified Data.Map as Map
14−import qualified Data.Text.Lazy as LazyText
15import Data.Text (Text)
14import Data.Text (Text)
15+import qualified Data.ByteString.Builder as BS
16import Text.PrettyPrint.ANSI.Leijen (Doc)
16import Text.PrettyPrint.ANSI.Leijen (Doc)
17
17
18import qualified AST.Module as Module
18import qualified AST.Module as Module
@@ -127,7 +127,7 @@ data Result =
127 Result
127 Result
128 { _docs :: Maybe Docs.Documentation
128 { _docs :: Maybe Docs.Documentation
129 , _iface :: M.Interface
129 , _iface :: M.Interface
130− , _js :: LazyText.Text
130+ , _js :: BS.Builder
131 }
131 }
132
132
133
133
src/Generate/JavaScript.hs+3−3
@@ -4,7 +4,7 @@ module Generate.JavaScript (generate) where
4
4
5import qualified Control.Monad.State as State
5import qualified Control.Monad.State as State
6import Data.Text (Text)
6import Data.Text (Text)
7−import qualified Data.Text.Lazy as LazyText
7+import qualified Data.ByteString.Builder as BS
8
8
9import qualified AST.Effects as Effects
9import qualified AST.Effects as Effects
10import qualified AST.Module as Module
10import qualified AST.Module as Module
@@ -20,7 +20,7 @@ import qualified Generate.JavaScript.Variable as Var
20-- GENERATE JAVASCRIPT
20-- GENERATE JAVASCRIPT
21
21
22
22
23−generate :: Module.Optimized -> LazyText.Text
23+generate :: Module.Optimized -> BS.Builder
24generate (Module.Module moduleName info) =
24generate (Module.Module moduleName info) =
25 let
25 let
26 genBody =
26 genBody =
@@ -31,7 +31,7 @@ generate (Module.Module moduleName info) =
31 body =
31 body =
32 State.evalState genBody 0
32 State.evalState genBody 0
33 in
33 in
34− JS.stmtsToText body
34+ JS.encodeUtf8 body
35
35
36
36
37
37
src/Generate/JavaScript/Builder.hs+16−13
@@ -1,10 +1,10 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.JavaScript.Builder
3module Generate.JavaScript.Builder
4+ ( encodeUtf8
4− ( Expr(..), Id(..), Prop(..), LValue(..)
5+ , Expr(..), Id(..), Prop(..), LValue(..)
5 , Stmt(..), Case(..), VarDecl(..)
6 , Stmt(..), Case(..), VarDecl(..)
6 , InfixOp(..), PrefixOp(..)
7 , InfixOp(..), PrefixOp(..)
7− , stmtsToText
8 )
8 )
9 where
9 where
10
10
@@ -15,12 +15,10 @@ module Generate.JavaScript.Builder
15
15
16import Prelude hiding (lines)
16import Prelude hiding (lines)
17import qualified Data.List as List
17import qualified Data.List as List
18+import Data.ByteString.Builder
18import Data.Monoid ((<>))
19import Data.Monoid ((<>))
19import Data.Text (Text)
20import Data.Text (Text)
20−import Data.Text.Lazy.Builder
21−import Data.Text.Lazy.Builder.Int (decimal)
22−import Data.Text.Lazy.Builder.RealFloat (realFloat)
23−import qualified Data.Text.Lazy as LazyText
21+import qualified Data.Text.Encoding as Text
24
22
25
23
26
24
@@ -129,12 +127,12 @@ data PrefixOp
129
127
130
128
131
129
132−-- CONVERT TO LAZY TEXT
130+-- ENCODE
133
131
134
132
135−stmtsToText :: [Stmt] -> LazyText.Text
133+encodeUtf8 :: [Stmt] -> Builder
136−stmtsToText stmts =
134+encodeUtf8 stmts =
137− toLazyText (fromStmtBlock "" stmts)
135+ fromStmtBlock "" stmts
138
136
139
137
140
138
@@ -277,6 +275,11 @@ fromId (Id name) =
277 fromText name
275 fromText name
278
276
279
277
278+fromText :: Text -> Builder
279+fromText txt =
280+ byteString (Text.encodeUtf8 txt)
281+
282+
280
283
281-- VAR DECLS
284-- VAR DECLS
282
285
@@ -334,10 +337,10 @@ fromExpr indent grouping expression =
334 (One, quoted string)
337 (One, quoted string)
335
338
336 Float n ->
339 Float n ->
337− (One, realFloat n)
340+ (One, doubleDec n)
338
341
339 Int n ->
342 Int n ->
340− (One, decimal n)
343+ (One, intDec n)
341
344
342 Bool bool ->
345 Bool bool ->
343 (One, if bool then "true" else "false")
346 (One, if bool then "true" else "false")
@@ -482,7 +485,7 @@ fromProp prop =
482 quoted string
485 quoted string
483
486
484 IntProp n ->
487 IntProp n ->
485− decimal n
488+ intDec n
486
489
487
490
488
491