@@ -7,11 +7,14 @@ module Optimize.Names
8 , registerKernel
8 , registerKernel
9 , registerGlobal
9 , registerGlobal
14import Data.Monoid ((<>))
16import Data.Monoid ((<>))
17+import qualified Data.Map as Map
15import qualified Data.Set as Set
18import qualified Data.Set as Set
16import qualified Data.Text as Text
19import qualified Data.Text as Text
@@ -30,34 +33,51 @@ newtype Tracker a =
31 -> Set.Set N.Name
34 -> Set.Set N.Name
32 -> Set.Set Opt.Global
35 -> Set.Set Opt.Global
36+ -> Map.Map N.Name Int
33− -> (Int -> Set.Set N.Name -> Set.Set Opt.Global -> a -> r)
37+ -> (Int -> Set.Set N.Name -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
38−run :: Tracker a -> (Set.Set N.Name, Set.Set Opt.Global, a)
42+run :: Tracker a -> (Set.Set N.Name, Set.Set Opt.Global, Map.Map N.Name Int, a)
39run (Tracker k) =
43run (Tracker k) =
40− k 0 Set.empty Set.empty
44+ k 0 Set.empty Set.empty Map.empty
41− (\_uid kernels globals value -> (kernels, globals, value))
45+ (\_uid kernels globals fields value -> (kernels, globals, fields, value))
44generate :: Tracker N.Name
48generate :: Tracker N.Name
46− Tracker $ \n k g ok ->
50+ Tracker $ \n k g f ok ->
47− ok (n + 1) k g ("_n" <> Text.pack (show n))
51+ ok (n + 1) k g f ("_n" <> Text.pack (show n))
50registerKernel :: N.Name -> a -> Tracker a
54registerKernel :: N.Name -> a -> Tracker a
51registerKernel name value =
55registerKernel name value =
52− Tracker $ \n k g ok ->
56+ Tracker $ \n k g f ok ->
53− ok n (Set.insert name k) g value
57+ ok n (Set.insert name k) g f value
56registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
60registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
57registerGlobal home name =
61registerGlobal home name =
58− Tracker $ \n k g ok ->
62+ Tracker $ \n k g f ok ->
59 let global = Opt.Global home name in
63 let global = Opt.Global home name in
60− ok n k (Set.insert global g) (Opt.VarGlobal global)
64+ ok n k (Set.insert global g) f (Opt.VarGlobal global)
67+registerField :: N.Name -> a -> Tracker a
68+registerField name value =
69+ Tracker $ \n k g fields ok ->
70+ ok n k g (Map.insertWith (+) name 1 fields) value
73+registerFields :: Map.Map N.Name v -> a -> Tracker a
74+registerFields newFields value =
75+ Tracker $ \n k g fields ok ->
76+ ok n k g (Map.unionWith (+) fields (Map.map toOne newFields)) value
@@ -66,40 +86,40 @@ registerGlobal home name =
67instance Functor Tracker where
87instance Functor Tracker where
68 fmap func (Tracker kv) =
88 fmap func (Tracker kv) =
69− Tracker $ \n k g ok ->
89+ Tracker $ \n k g f ok ->
71− ok1 n1 k1 g1 value =
91+ ok1 n1 k1 g1 f1 value =
72− ok n1 k1 g1 (func value)
92+ ok n1 k1 g1 f1 (func value)
74− kv n k g ok1
94+ kv n k g f ok1
77instance Applicative Tracker where
97instance Applicative Tracker where
78 {-# INLINE pure #-}
98 {-# INLINE pure #-}
79 pure value =
99 pure value =
80− Tracker $ \n k g ok -> ok n k g value
100+ Tracker $ \n k g f ok -> ok n k g f value
82 (<*>) (Tracker kf) (Tracker kv) =
102 (<*>) (Tracker kf) (Tracker kv) =
83− Tracker $ \n0 k0 g0 ok ->
103+ Tracker $ \n0 k0 g0 f0 ok ->
85− ok1 n1 k1 g1 func =
105+ ok1 n1 k1 g1 f1 func =
87− ok2 n2 k2 g2 value =
107+ ok2 n2 k2 g2 f2 value =
88− ok n2 k2 g2 (func value)
108+ ok n2 k2 g2 f2 (func value)
90− kv n1 k1 g1 ok2
110+ kv n1 k1 g1 f1 ok2
92− kf n0 k0 g0 ok1
112+ kf n0 k0 g0 f0 ok1
95instance Monad Tracker where
115instance Monad Tracker where
96 return = pure
116 return = pure
98 (>>=) (Tracker ka) callback =
118 (>>=) (Tracker ka) callback =
99− Tracker $ \n k g ok ->
119+ Tracker $ \n k g f ok ->
101− ok1 n1 k1 g1 a =
121+ ok1 n1 k1 g1 f1 a =
102 case callback a of
122 case callback a of
103− Tracker kb -> kb n1 k1 g1 ok
123+ Tracker kb -> kb n1 k1 g1 f1 ok
105− ka n k g ok1
125+ ka n k g f ok1