@@ -4,9 +4,7 @@ module Generate.JavaScript
4 ( ReplBuilder(..)
4 ( ReplBuilder(..)
5 , generateForRepl
5 , generateForRepl
7− , MainsBuilder(..)
7+ , generate
@@ -55,18 +53,11 @@ generateForRepl (Opt.Graph _ graph _) home name =
55-- GENERATE MAINS
53-- GENERATE MAINS
60− { _main_code :: B.Builder
61− , _main_trie :: MainTrie
65data Mode = Debug | Prod
56data Mode = Debug | Prod
68−generateMains :: Mode -> Name.Target -> Opt.Graph -> I.Interfaces -> [ModuleName.Canonical] -> Either [ModuleName.Canonical] MainsBuilder
59+generate :: Mode -> Name.Target -> Opt.Graph -> I.Interfaces -> [ModuleName.Canonical] -> Either [ModuleName.Canonical] B.Builder
69−generateMains mode target (Opt.Graph mains graph fields) interfaces roots =
60+generate mode target (Opt.Graph mains graph fields) interfaces roots =
71 rootSet = Set.fromList roots
62 rootSet = Set.fromList roots
72 rootMap = Map.restrictKeys mains rootSet
63 rootMap = Map.restrictKeys mains rootSet
@@ -76,7 +67,7 @@ generateMains mode target (Opt.Graph mains graph fields) interfaces roots =
76 realMode = toRealMode mode target fields
67 realMode = toRealMode mode target fields
77 state = Map.foldrWithKey (addMain realMode graph) emptyState rootMap
68 state = Map.foldrWithKey (addMain realMode graph) emptyState rootMap
79− Right $ MainsBuilder (stateToBuilder state) (toMainTrie realMode interfaces rootMap)
70+ Right $ stateToBuilder state <> toMainExports realMode interfaces rootMap
82 Left $ Set.toList $
73 Left $ Set.toList $
@@ -367,49 +358,85 @@ generateManagerHelp home effectsType =
370−-- MAIN TRIE
361+-- MAIN EXPORTS
373−data MainTrie =
364+toMainExports :: Name.Mode -> I.Interfaces -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
374− MainTrie
365+toMainExports mode interfaces mains =
375− { _main :: Maybe B.Builder
366+ let
376− , _subs :: Map.Map N.Name MainTrie
367+ export =
377− }
368+ Name.fromKernel N.platform "export"
371+ generateExports mode interfaces $
372+ Map.foldrWithKey addToTrie emptyTrie mains
374+ Name.toBuilder export <> "(" <> exports <> ");"
380−emptyTrie :: MainTrie
382− MainTrie Nothing Map.empty
377+generateExports :: Name.Mode -> I.Interfaces -> Trie -> B.Builder
378+generateExports mode interfaces (Trie maybeMain subs) =
381+ case Map.toList subs of
385+ (name, subTrie) : otherSubTries ->
386+ "{'" <> N.toBuilder name <> "':"
387+ <> generateExports mode interfaces subTrie
388+ <> List.foldl' (addSubTrie mode interfaces) "}" otherSubTries
385−toMainTrie :: Name.Mode -> I.Interfaces -> Map.Map ModuleName.Canonical Opt.Main -> MainTrie
394+ Just (home, main) ->
386−toMainTrie mode interfaces mains =
395+ let initialize = Expr.generateMain mode interfaces home main in
387− Map.foldrWithKey (addMainTrie mode interfaces) emptyTrie mains
396+ JS.exprToBuilder initialize <> "(" <> object <> ")"
399+addSubTrie :: Name.Mode -> I.Interfaces -> B.Builder -> (N.Name, Trie) -> B.Builder
400+addSubTrie mode interfaces end (name, trie) =
401+ ",'" <> N.toBuilder name <> "':"
402+ <> generateExports mode interfaces trie
412+ { _main :: Maybe (ModuleName.Canonical, Opt.Main)
413+ , _subs :: Map.Map N.Name Trie
419+ Trie Nothing Map.empty
390−addMainTrie :: Name.Mode -> I.Interfaces -> ModuleName.Canonical -> Opt.Main -> MainTrie -> MainTrie
422+addToTrie :: ModuleName.Canonical -> Opt.Main -> Trie -> Trie
391−addMainTrie mode interfaces home@(ModuleName.Canonical _ moduleName) main trie =
423+addToTrie home@(ModuleName.Canonical _ moduleName) main trie =
393− segments = Text.splitOn "." moduleName
424+ merge trie $ segmentsToTrie home (Text.splitOn "." moduleName) main
394− initMain = Expr.generateMain mode interfaces home segments main
395− newTrie = segmentsToTrie segments (JS.exprToBuilder initMain)
400−segmentsToTrie :: [N.Name] -> B.Builder -> MainTrie
427+segmentsToTrie :: ModuleName.Canonical -> [N.Name] -> Opt.Main -> Trie
401−segmentsToTrie segments mainBuilder =
428+segmentsToTrie home segments main =
402 case segments of
429 case segments of
404− MainTrie (Just mainBuilder) Map.empty
431+ Trie (Just (home, main)) Map.empty
406 segment : otherSegments ->
433 segment : otherSegments ->
407− MainTrie Nothing (Map.singleton segment (segmentsToTrie otherSegments mainBuilder))
434+ Trie Nothing (Map.singleton segment (segmentsToTrie home otherSegments main))
410−merge :: MainTrie -> MainTrie -> MainTrie
437+merge :: Trie -> Trie -> Trie
411−merge (MainTrie main1 subs1) (MainTrie main2 subs2) =
438+merge (Trie main1 subs1) (Trie main2 subs2) =
413 (checkedMerge main1 main2)
440 (checkedMerge main1 main2)
414 (Map.unionWith merge subs1 subs2)
441 (Map.unionWith merge subs1 subs2)