@@ -1,15 +1,14 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module Generate.JavaScript
4− ( ReplBuilder(..)
5− , generateForRepl
6− , Mode(..)
4+ ( Mode(..)
75 , generate
6+ , generateForRepl
87 )
98 where
109
1110
12−import Prelude hiding (cycle)
11+import Prelude hiding (cycle, print)
1312import qualified Data.ByteString.Builder as B
1413import Data.Monoid ((<>))
1514import qualified Data.List as List
@@ -20,6 +19,8 @@ import qualified Data.Text as Text
2019
2120import qualified AST.Optimized as Opt
2221import qualified AST.Module.Name as ModuleName
22+import qualified Elm.Compiler.Type as Type
23+import qualified Elm.Compiler.Type.Extract as Extract
2324import qualified Elm.Interface as I
2425import qualified Elm.Name as N
2526import qualified Generate.JavaScript.Builder as JS
@@ -28,36 +29,14 @@ import qualified Generate.JavaScript.Name as Name
2829
2930
3031
31−-- GENERATE FOR REPL
32−
33−
34−data ReplBuilder =
35− ReplBuilder
36− { _repl_code :: B.Builder
37− , _repl_name :: B.Builder
38− }
39−
40−
41−generateForRepl :: Opt.Graph -> ModuleName.Canonical -> N.Name -> ReplBuilder
42−generateForRepl (Opt.Graph _ graph _) home name =
43− ReplBuilder
44− { _repl_code =
45− stateToBuilder $
46− addGlobal (Name.Debug Name.Client) graph emptyState (Opt.Global home name)
47− , _repl_name =
48− Name.toBuilder (Name.fromGlobal home name)
49− }
50−
51−
52−
5332-- GENERATE MAINS
5433
5534
5635data Mode = Debug | Prod
5736
5837
59−generate :: Mode -> Name.Target -> Opt.Graph -> I.Interfaces -> [ModuleName.Canonical] -> Either [ModuleName.Canonical] B.Builder
60−generate mode target (Opt.Graph mains graph fields) interfaces roots =
38+generate :: Mode -> Name.Target -> I.Interfaces -> Opt.Graph -> [ModuleName.Canonical] -> Either [ModuleName.Canonical] B.Builder
39+generate mode target interfaces (Opt.Graph mains graph fields) roots =
6140 let
6241 rootSet = Set.fromList roots
6342 rootMap = Map.restrictKeys mains rootSet
@@ -90,6 +69,36 @@ toRealMode mode target fields =
9069
9170
9271
72+-- GENERATE FOR REPL
73+
74+
75+generateForRepl :: I.Interfaces -> Opt.Graph -> ModuleName.Canonical -> N.Name -> B.Builder
76+generateForRepl interfaces (Opt.Graph _ graph _) home name =
77+ let
78+ mode = Name.Debug Name.Server
79+ eval = addGlobal mode graph emptyState (Opt.Global home name)
80+ in
81+ stateToBuilder eval <> print interfaces home name
82+
83+
84+print :: I.Interfaces -> ModuleName.Canonical -> N.Name -> B.Builder
85+print interfaces home name =
86+ let
87+ value = Name.toBuilder (Name.fromGlobal home name)
88+ toString = Name.toBuilder (Name.fromKernel N.debug "toString")
89+ annotation = I._types (interfaces ! home) ! name
90+ tipe = Type.toString Type.MultiLine $ Extract.fromAnnotation annotation
91+ in
92+ "var _value = " <> toString <> "(" <> value <> ");\n" <>
93+ "var _type = '" <> B.stringUtf8 (show tipe) <> "';\n\
94+ \if (_value.length + 3 + _type.length >= 80 || _type.indexOf('\\n') >= 0) {\n\
95+ \ console.log(_value + '\\n : ' + _type.split('\\n').join('\\n '));\n\
96+ \} else {\n\
97+ \ console.log(_value + ' : ' + _type);\n\
98+ \}\n"
99+
100+
101+
93102-- GRAPH TRAVERSAL STATE
94103
95104