@@ -22,6 +22,7 @@ import qualified Data.Text as Text
2222import qualified AST.Optimized as Opt
2323import qualified AST.Module.Name as ModuleName
2424import qualified Elm.Name as N
25+import qualified Elm.Package as Pkg
2526
2627
2728
@@ -32,49 +33,53 @@ newtype Tracker a =
3233 Tracker (
3334 forall r.
3435 Int
35− -> Set.Set N.Name
3636 -> Set.Set Opt.Global
3737 -> Map.Map N.Name Int
38− -> (Int -> Set.Set N.Name -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
38+ -> (Int -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
3939 -> r
4040 )
4141
4242
43−run :: Tracker a -> (Set.Set N.Name, Set.Set Opt.Global, Map.Map N.Name Int, a)
43+run :: Tracker a -> (Set.Set Opt.Global, Map.Map N.Name Int, a)
4444run (Tracker k) =
45− k 0 Set.empty Set.empty Map.empty
46− (\_uid kernels globals fields value -> (kernels, globals, fields, value))
45+ k 0 Set.empty Map.empty
46+ (\_uid deps fields value -> (deps, fields, value))
4747
4848
4949generate :: Tracker N.Name
5050generate =
51− Tracker $ \n k g f ok ->
52− ok (n + 1) k g f ("_n" <> Text.pack (show n))
51+ Tracker $ \uid deps fields ok ->
52+ ok (uid + 1) deps fields ("_n" <> Text.pack (show uid))
5353
5454
5555registerKernel :: N.Name -> a -> Tracker a
56−registerKernel name value =
57− Tracker $ \n k g f ok ->
58− ok n (Set.insert name k) g f value
56+registerKernel home value =
57+ Tracker $ \uid deps fields ok ->
58+ ok uid (Set.insert (toKernelGlobal home) deps) fields value
59+
60+
61+toKernelGlobal :: N.Name -> Opt.Global
62+toKernelGlobal home =
63+ Opt.Global (ModuleName.Canonical Pkg.kernel home) N.dollar
5964
6065
6166registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
6267registerGlobal home name =
63− Tracker $ \n k g f ok ->
68+ Tracker $ \uid deps fields ok ->
6469 let global = Opt.Global home name in
65− ok n k (Set.insert global g) f (Opt.VarGlobal global)
70+ ok uid (Set.insert global deps) fields (Opt.VarGlobal global)
6671
6772
6873registerField :: N.Name -> a -> Tracker a
6974registerField name value =
70− Tracker $ \n k g fields ok ->
71− ok n k g (Map.insertWith (+) name 1 fields) value
75+ Tracker $ \uid d fields ok ->
76+ ok uid d (Map.insertWith (+) name 1 fields) value
7277
7378
7479registerFieldDict :: Map.Map N.Name v -> a -> Tracker a
7580registerFieldDict newFields value =
76− Tracker $ \n k g fields ok ->
77− ok n k g (Map.unionWith (+) fields (Map.map toOne newFields)) value
81+ Tracker $ \uid d fields ok ->
82+ ok uid d (Map.unionWith (+) fields (Map.map toOne newFields)) value
7883
7984
8085toOne :: a -> Int
@@ -83,8 +88,8 @@ toOne _ = 1
8388
8489registerFieldList :: [N.Name] -> a -> Tracker a
8590registerFieldList names value =
86− Tracker $ \n k g fields ok ->
87− ok n k g (foldr addOne fields names) value
91+ Tracker $ \uid deps fields ok ->
92+ ok uid deps (foldr addOne fields names) value
8893
8994
9095addOne :: N.Name -> Map.Map N.Name Int -> Map.Map N.Name Int
@@ -98,40 +103,40 @@ addOne name fields =
98103
99104instance Functor Tracker where
100105 fmap func (Tracker kv) =
101− Tracker $ \n k g f ok ->
106+ Tracker $ \n d f ok ->
102107 let
103− ok1 n1 k1 g1 f1 value =
104− ok n1 k1 g1 f1 (func value)
108+ ok1 n1 d1 f1 value =
109+ ok n1 d1 f1 (func value)
105110 in
106− kv n k g f ok1
111+ kv n d f ok1
107112
108113
109114instance Applicative Tracker where
110115 {-# INLINE pure #-}
111116 pure value =
112− Tracker $ \n k g f ok -> ok n k g f value
117+ Tracker $ \n d f ok -> ok n d f value
113118
114119 (<*>) (Tracker kf) (Tracker kv) =
115− Tracker $ \n0 k0 g0 f0 ok ->
120+ Tracker $ \n d f ok ->
116121 let
117− ok1 n1 k1 g1 f1 func =
122+ ok1 n1 d1 f1 func =
118123 let
119− ok2 n2 k2 g2 f2 value =
120− ok n2 k2 g2 f2 (func value)
124+ ok2 n2 d2 f2 value =
125+ ok n2 d2 f2 (func value)
121126 in
122− kv n1 k1 g1 f1 ok2
127+ kv n1 d1 f1 ok2
123128 in
124− kf n0 k0 g0 f0 ok1
129+ kf n d f ok1
125130
126131
127132instance Monad Tracker where
128133 return = pure
129134
130− (>>=) (Tracker ka) callback =
131− Tracker $ \n k g f ok ->
135+ (>>=) (Tracker k) callback =
136+ Tracker $ \n d f ok ->
132137 let
133− ok1 n1 k1 g1 f1 a =
138+ ok1 n1 d1 f1 a =
134139 case callback a of
135− Tracker kb -> kb n1 k1 g1 f1 ok
140+ Tracker kb -> kb n1 d1 f1 ok
136141 in
137− ka n k g f ok1
142+ k n d f ok1