on 1ae4e82 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
18import qualified Data.Name as Name
20import qualified AST.Optimized as Opt
21import qualified Elm.ModuleName as ModuleName
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 Name.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 :: Name.Name -> Opt.Global
78toGlobal home =
79 Opt.Global (ModuleName.Canonical Pkg.kernel (Name.getKernel home)) Name.dollar
82toNode :: Kernel -> Opt.Node
83toNode (Kernel client server) =
84 Opt.Kernel client server
88-- KERNEL TO ELM FIELDS
91addKernel :: Map.Map Name.Name Int -> Kernel -> Map.Map Name.Name Int
92addKernel fields (Kernel client maybeServer) =
93 addContent (maybe fields (addContent fields) maybeServer) client
96addContent :: Map.Map Name.Name Int -> Opt.KContent -> Map.Map Name.Name Int
97addContent fields (Opt.KContent chunks _) =
98 List.foldl' addChunk fields chunks
101addChunk :: Map.Map Name.Name Int -> Opt.KChunk -> Map.Map Name.Name Int
102addChunk fields chunk =
103 case chunk of
104 Opt.ElmField name ->
105 Map.insertWith (+) name 1 fields
107 _ ->
108 fields