on 6a96e21 help sign in
111 lines 2.1 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler.Objects
3 ( Name.Target(..)
4 , JS.Mode(..)
5 , JS.Output(..)
6 , JS.generate
7 , JS.generateForRepl
8 , Opt.Graph
9 , empty
10 , union
11 , unions
12 , Kernel(..)
13 , fromKernels
14 )
15 where
18import qualified Data.List as List
19import qualified Data.Map as Map
21import qualified AST.Optimized as Opt
22import qualified AST.Module.Name as ModuleName
23import qualified Elm.Name as N
24import qualified Elm.Package as Pkg
25import qualified Generate.JavaScript as JS
26import qualified Generate.JavaScript.Name as Name
30-- COMBINE GRAPHS
33{-# NOINLINE empty #-}
34empty :: Opt.Graph
35empty =
36 Opt.Graph Map.empty Map.empty Map.empty
39union :: Opt.Graph -> Opt.Graph -> Opt.Graph
40union (Opt.Graph mains1 graph1 fields1) (Opt.Graph mains2 graph2 fields2) =
41 Opt.Graph
42 (Map.union mains1 mains2)
43 (Map.union graph1 graph2)
44 (Map.union fields1 fields2)
47unions :: [Opt.Graph] -> Opt.Graph
48unions graphs =
49 case graphs of
50 [] ->
51 empty
53 g:gs ->
54 List.foldl' union g gs
58-- KERNEL GRAPHS
61data Kernel =
62 Kernel
63 { _client :: Opt.KContent
64 , _server :: Maybe Opt.KContent
65 }
68fromKernels :: Map.Map N.Name Kernel -> Opt.Graph
69fromKernels kernels =
70 Opt.Graph
71 Map.empty
72 (Map.mapKeys toGlobal (Map.map toNode kernels))
73 (Map.foldl' addKernel Map.empty kernels)
77-- KERNEL TO NODES
80toGlobal :: N.Name -> Opt.Global
81toGlobal home =
82 Opt.Global (ModuleName.Canonical Pkg.kernel (ModuleName.getKernel home)) N.dollar
85toNode :: Kernel -> Opt.Node
86toNode (Kernel client server) =
87 Opt.Kernel client server
91-- KERNEL TO ELM FIELDS
94addKernel :: Map.Map N.Name Int -> Kernel -> Map.Map N.Name Int
95addKernel fields (Kernel client maybeServer) =
96 addContent (maybe fields (addContent fields) maybeServer) client
99addContent :: Map.Map N.Name Int -> Opt.KContent -> Map.Map N.Name Int
100addContent fields (Opt.KContent chunks _) =
101 List.foldl' addChunk fields chunks
104addChunk :: Map.Map N.Name Int -> Opt.KChunk -> Map.Map N.Name Int
105addChunk fields chunk =
106 case chunk of
107 Opt.ElmField name ->
108 Map.insertWith (+) name 1 fields
110 _ ->
111 fields