1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE Rank2Types #-}
17import Data.Monoid ((<>))
18import qualified Data.Map as Map
19import qualified Data.Set as Set
20import qualified Data.Text as Text
22import qualified AST.Optimized as Opt
23import qualified AST.Module.Name as ModuleName
24import qualified Elm.Name as N
38 -> (Int -> Set.Set N.Name -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
43run :: Tracker a -> (Set.Set N.Name, Set.Set Opt.Global, Map.Map N.Name Int, a)
45 k 0 Set.empty Set.empty Map.empty
46 (\_uid kernels globals fields value -> (kernels, globals, fields, value))
49generate :: Tracker N.Name
51 Tracker $ \n k g f ok ->
52 ok (n + 1) k g f ("_n" <> Text.pack (show n))
55registerKernel :: N.Name -> a -> Tracker a
56registerKernel name value =
57 Tracker $ \n k g f ok ->
58 ok n (Set.insert name k) g f value
61registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
62registerGlobal home name =
63 Tracker $ \n k g f ok ->
64 let global = Opt.Global home name in
65 ok n k (Set.insert global g) f (Opt.VarGlobal global)
68registerField :: N.Name -> a -> Tracker a
69registerField name value =
70 Tracker $ \n k g fields ok ->
71 ok n k g (Map.insertWith (+) name 1 fields) value
74registerFieldDict :: Map.Map N.Name v -> a -> Tracker a
75registerFieldDict newFields value =
76 Tracker $ \n k g fields ok ->
77 ok n k g (Map.unionWith (+) fields (Map.map toOne newFields)) value
84registerFieldList :: [N.Name] -> a -> Tracker a
85registerFieldList names value =
86 Tracker $ \n k g fields ok ->
87 ok n k g (foldr addOne fields names) value
90addOne :: N.Name -> Map.Map N.Name Int -> Map.Map N.Name Int
92 Map.insertWith (+) name 1 fields
99instance Functor Tracker where
100 fmap func (Tracker kv) =
101 Tracker $ \n k g f ok ->
103 ok1 n1 k1 g1 f1 value =
104 ok n1 k1 g1 f1 (func value)
109instance Applicative Tracker where
112 Tracker $ \n k g f ok -> ok n k g f value
114 (<*>) (Tracker kf) (Tracker kv) =
115 Tracker $ \n0 k0 g0 f0 ok ->
117 ok1 n1 k1 g1 f1 func =
119 ok2 n2 k2 g2 f2 value =
120 ok n2 k2 g2 f2 (func value)
127instance Monad Tracker where
130 (>>=) (Tracker ka) callback =
131 Tracker $ \n k g f ok ->
135 Tracker kb -> kb n1 k1 g1 f1 ok
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list