on 42f3721 help sign in
108 lines 2.1 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler.Objects
3 ( JS.Output(..)
4 , JS.generate
5 , JS.generateForRepl
6 , Opt.Graph
7 , empty
8 , union
9 , unions
10 , Kernel(..)
11 , fromKernels
12 )
13 where
16import qualified Data.List as List
17import qualified Data.Map as Map
19import qualified AST.Optimized as Opt
20import qualified AST.Module.Name as ModuleName
21import qualified Elm.Name as N
22import qualified Elm.Package as Pkg
23import qualified Generate.JavaScript as JS
27-- COMBINE GRAPHS
30{-# NOINLINE empty #-}
31empty :: Opt.Graph
32empty =
33 Opt.Graph Map.empty Map.empty Map.empty
36union :: Opt.Graph -> Opt.Graph -> Opt.Graph
37union (Opt.Graph mains1 graph1 fields1) (Opt.Graph mains2 graph2 fields2) =
38 Opt.Graph
39 (Map.union mains1 mains2)
40 (Map.union graph1 graph2)
41 (Map.union fields1 fields2)
44unions :: [Opt.Graph] -> Opt.Graph
45unions graphs =
46 case graphs of
47 [] ->
48 empty
50 g:gs ->
51 List.foldl' union g gs
55-- KERNEL GRAPHS
58data Kernel =
59 Kernel
60 { _client :: Opt.KContent
61 , _server :: Maybe Opt.KContent
62 }
65fromKernels :: Map.Map N.Name Kernel -> Opt.Graph
66fromKernels kernels =
67 Opt.Graph
68 Map.empty
69 (Map.mapKeys toGlobal (Map.map toNode kernels))
70 (Map.foldl' addKernel Map.empty kernels)
74-- KERNEL TO NODES
77toGlobal :: N.Name -> Opt.Global
78toGlobal home =
79 Opt.Global (ModuleName.Canonical Pkg.kernel (ModuleName.getKernel home)) N.dollar
82toNode :: Kernel -> Opt.Node
83toNode (Kernel client server) =
84 Opt.Kernel client server
88-- KERNEL TO ELM FIELDS
91addKernel :: Map.Map N.Name Int -> Kernel -> Map.Map N.Name Int
92addKernel fields (Kernel client maybeServer) =
93 addContent (maybe fields (addContent fields) maybeServer) client
96addContent :: Map.Map N.Name Int -> Opt.KContent -> Map.Map N.Name Int
97addContent fields (Opt.KContent chunks _) =
98 List.foldl' addChunk fields chunks
101addChunk :: Map.Map N.Name Int -> Opt.KChunk -> Map.Map N.Name Int
102addChunk fields chunk =
103 case chunk of
104 Opt.ElmField name ->
105 Map.insertWith (+) name 1 fields
107 _ ->
108 fields