@@ -22,6 +22,7 @@ import qualified Data.Text as Text
22import qualified AST.Optimized as Opt
22import qualified AST.Optimized as Opt
23import qualified AST.Module.Name as ModuleName
23import qualified AST.Module.Name as ModuleName
24import qualified Elm.Name as N
24import qualified Elm.Name as N
25+import qualified Elm.Package as Pkg
@@ -32,49 +33,53 @@ newtype Tracker a =
36 -> Set.Set Opt.Global
36 -> Set.Set Opt.Global
37 -> Map.Map N.Name Int
37 -> 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)
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)
44run (Tracker k) =
44run (Tracker k) =
45− k 0 Set.empty Set.empty Map.empty
45+ k 0 Set.empty Map.empty
46− (\_uid kernels globals fields value -> (kernels, globals, fields, value))
46+ (\_uid deps fields value -> (deps, fields, value))
49generate :: Tracker N.Name
49generate :: Tracker N.Name
51− Tracker $ \n k g f ok ->
51+ Tracker $ \uid deps fields ok ->
52− ok (n + 1) k g f ("_n" <> Text.pack (show n))
52+ ok (uid + 1) deps fields ("_n" <> Text.pack (show uid))
55registerKernel :: N.Name -> a -> Tracker a
55registerKernel :: N.Name -> a -> Tracker a
56−registerKernel name value =
56+registerKernel home value =
57− Tracker $ \n k g f ok ->
57+ Tracker $ \uid deps fields ok ->
58− ok n (Set.insert name k) g f value
58+ ok uid (Set.insert (toKernelGlobal home) deps) fields value
61+toKernelGlobal :: N.Name -> Opt.Global
63+ Opt.Global (ModuleName.Canonical Pkg.kernel home) N.dollar
61registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
66registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
62registerGlobal home name =
67registerGlobal home name =
63− Tracker $ \n k g f ok ->
68+ Tracker $ \uid deps fields ok ->
64 let global = Opt.Global home name in
69 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)
68registerField :: N.Name -> a -> Tracker a
73registerField :: N.Name -> a -> Tracker a
69registerField name value =
74registerField name value =
70− Tracker $ \n k g fields ok ->
75+ Tracker $ \uid d fields ok ->
71− ok n k g (Map.insertWith (+) name 1 fields) value
76+ ok uid d (Map.insertWith (+) name 1 fields) value
74registerFieldDict :: Map.Map N.Name v -> a -> Tracker a
79registerFieldDict :: Map.Map N.Name v -> a -> Tracker a
75registerFieldDict newFields value =
80registerFieldDict newFields value =
76− Tracker $ \n k g fields ok ->
81+ Tracker $ \uid d fields ok ->
77− ok n k g (Map.unionWith (+) fields (Map.map toOne newFields)) value
82+ ok uid d (Map.unionWith (+) fields (Map.map toOne newFields)) value
80toOne :: a -> Int
85toOne :: a -> Int
@@ -83,8 +88,8 @@ toOne _ = 1
84registerFieldList :: [N.Name] -> a -> Tracker a
89registerFieldList :: [N.Name] -> a -> Tracker a
85registerFieldList names value =
90registerFieldList names value =
86− Tracker $ \n k g fields ok ->
91+ Tracker $ \uid deps fields ok ->
87− ok n k g (foldr addOne fields names) value
92+ ok uid deps (foldr addOne fields names) value
90addOne :: N.Name -> Map.Map N.Name Int -> Map.Map N.Name Int
95addOne :: N.Name -> Map.Map N.Name Int -> Map.Map N.Name Int
@@ -98,40 +103,40 @@ addOne name fields =
99instance Functor Tracker where
104instance Functor Tracker where
100 fmap func (Tracker kv) =
105 fmap func (Tracker kv) =
101− Tracker $ \n k g f ok ->
106+ Tracker $ \n d f ok ->
103− ok1 n1 k1 g1 f1 value =
108+ ok1 n1 d1 f1 value =
104− ok n1 k1 g1 f1 (func value)
109+ ok n1 d1 f1 (func value)
106− kv n k g f ok1
111+ kv n d f ok1
109instance Applicative Tracker where
114instance Applicative Tracker where
110 {-# INLINE pure #-}
115 {-# INLINE pure #-}
111 pure value =
116 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
114 (<*>) (Tracker kf) (Tracker kv) =
119 (<*>) (Tracker kf) (Tracker kv) =
115− Tracker $ \n0 k0 g0 f0 ok ->
120+ Tracker $ \n d f ok ->
117− ok1 n1 k1 g1 f1 func =
122+ ok1 n1 d1 f1 func =
119− ok2 n2 k2 g2 f2 value =
124+ ok2 n2 d2 f2 value =
120− ok n2 k2 g2 f2 (func value)
125+ ok n2 d2 f2 (func value)
122− kv n1 k1 g1 f1 ok2
127+ kv n1 d1 f1 ok2
124− kf n0 k0 g0 f0 ok1
129+ kf n d f ok1
127instance Monad Tracker where
132instance Monad Tracker where
128 return = pure
133 return = pure
130− (>>=) (Tracker ka) callback =
135+ (>>=) (Tracker k) callback =
131− Tracker $ \n k g f ok ->
136+ Tracker $ \n d f ok ->
133− ok1 n1 k1 g1 f1 a =
138+ ok1 n1 d1 f1 a =
134 case callback a of
139 case callback a of
135− Tracker kb -> kb n1 k1 g1 f1 ok
140+ Tracker kb -> kb n1 d1 f1 ok
137− ka n k g f ok1
142+ k n d f ok1