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
25import qualified Elm.Package as Pkg
38 -> (Int -> Set.Set Opt.Global -> Map.Map N.Name Int -> a -> r)
43run :: Tracker a -> (Set.Set Opt.Global, Map.Map N.Name Int, a)
45 k 0 Set.empty Map.empty
46 (\_uid deps fields value -> (deps, fields, value))
49generate :: Tracker N.Name
51 Tracker $ \uid deps fields ok ->
52 ok (uid + 1) deps fields ("_n" <> Text.pack (show uid))
55registerKernel :: N.Name -> a -> Tracker a
56registerKernel home value =
57 Tracker $ \uid deps fields ok ->
58 ok uid (Set.insert (toKernelGlobal home) deps) fields value
61toKernelGlobal :: N.Name -> Opt.Global
63 Opt.Global (ModuleName.Canonical Pkg.kernel home) N.dollar
66registerGlobal :: ModuleName.Canonical -> N.Name -> Tracker Opt.Expr
67registerGlobal home name =
68 Tracker $ \uid deps fields ok ->
69 let global = Opt.Global home name in
70 ok uid (Set.insert global deps) fields (Opt.VarGlobal global)
73registerField :: N.Name -> a -> Tracker a
74registerField name value =
75 Tracker $ \uid d fields ok ->
76 ok uid d (Map.insertWith (+) name 1 fields) value
79registerFieldDict :: Map.Map N.Name v -> a -> Tracker a
80registerFieldDict newFields value =
81 Tracker $ \uid d fields ok ->
82 ok uid d (Map.unionWith (+) fields (Map.map toOne newFields)) value
89registerFieldList :: [N.Name] -> a -> Tracker a
90registerFieldList names value =
91 Tracker $ \uid deps fields ok ->
92 ok uid deps (foldr addOne fields names) value
95addOne :: N.Name -> Map.Map N.Name Int -> Map.Map N.Name Int
97 Map.insertWith (+) name 1 fields
104instance Functor Tracker where
105 fmap func (Tracker kv) =
106 Tracker $ \n d f ok ->
109 ok n1 d1 f1 (func value)
114instance Applicative Tracker where
117 Tracker $ \n d f ok -> ok n d f value
119 (<*>) (Tracker kf) (Tracker kv) =
120 Tracker $ \n d f ok ->
125 ok n2 d2 f2 (func value)
132instance Monad Tracker where
135 (>>=) (Tracker k) callback =
136 Tracker $ \n d f ok ->
140 Tracker kb -> kb n1 d1 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