{-# LANGUAGE PatternSynonyms #-}
module GHC.Types.Var.FV (
FV( runFV, MkFV ),
BoundVars, VarSetFV, DVarSetFV, SelectiveDFV,
TyCoFV, DTyCoFV,
runFVTop, runFVAcc, runTyCoVars, runTyCoVarsDSet,
runFVSelective, runFVSelectiveList, runFVSelectiveSet,
InterestingVarFun,
updEnvFV, addBndrFV, addBndrsFV, addBndrSelectiveFV, addBndrsSelectiveFV,
emptyFV,
unionFV,
mapUnionFV
) where
import GHC.Prelude
import GHC.Types.Var
import GHC.Types.Var.Set
import GHC.Utils.EndoOS
import GHC.Exts( oneShot )
import Data.Semigroup
type InterestingVarFun = Var -> Bool
type BoundVars = TyCoVarSet
type VarSetFV = FV BoundVars (EndoOS TyCoVarSet)
type DVarSetFV = FV BoundVars (EndoOS DTyCoVarSet)
type SelectiveDFV = FV (BoundVars, InterestingVarFun) (EndoOS DVarSet)
type TyCoFV = VarSetFV
type DTyCoFV = DVarSetFV
newtype FV env acc = MkFV' { forall env acc. FV env acc -> env -> acc
runFV :: env -> acc }
pattern MkFV :: (env -> acc) -> FV env acc
{-# COMPLETE MkFV #-}
pattern $mMkFV :: forall {r} {env} {acc}.
FV env acc -> ((env -> acc) -> r) -> ((# #) -> r) -> r
$bMkFV :: forall env acc. (env -> acc) -> FV env acc
MkFV f <- MkFV' f
where
MkFV env -> acc
f = (env -> acc) -> FV env acc
forall env acc. (env -> acc) -> FV env acc
MkFV' ((env -> acc) -> env -> acc
forall a b. (a -> b) -> a -> b
oneShot (\env
env -> env
env env -> acc -> acc
forall a b. a -> b -> b
`seq` env -> acc
f env
env))
instance Semigroup a => Semigroup (FV env a) where
<> :: FV env a -> FV env a -> FV env a
(<>) = FV env a -> FV env a -> FV env a
forall a env. Semigroup a => FV env a -> FV env a -> FV env a
unionFV
instance Monoid a => Monoid (FV env a) where
mempty :: FV env a
mempty = FV env a
forall a env. Monoid a => FV env a
emptyFV
emptyFV :: Monoid a => FV env a
emptyFV :: forall a env. Monoid a => FV env a
emptyFV = (env -> a) -> FV env a
forall env acc. (env -> acc) -> FV env acc
MkFV (\env
_ -> a
forall a. Monoid a => a
mempty)
unionFV :: Semigroup a => FV env a -> FV env a -> FV env a
unionFV :: forall a env. Semigroup a => FV env a -> FV env a -> FV env a
unionFV (MkFV' env -> a
f1) (MkFV' env -> a
f2) = (env -> a) -> FV env a
forall env acc. (env -> acc) -> FV env acc
MkFV (\env
env -> env -> a
f1 env
env a -> a -> a
forall a. Semigroup a => a -> a -> a
<> env -> a
f2 env
env)
updEnvFV :: (env -> env) -> FV env a -> FV env a
updEnvFV :: forall env a. (env -> env) -> FV env a -> FV env a
updEnvFV env -> env
upd FV env a
f = (env -> a) -> FV env a
forall env acc. (env -> acc) -> FV env acc
MkFV (\env
bvs -> FV env a -> env -> a
forall env acc. FV env acc -> env -> acc
runFV FV env a
f (env -> a) -> env -> a
forall a b. (a -> b) -> a -> b
$! env -> env
upd env
bvs)
addBndrFV :: TyCoVar -> FV BoundVars a -> FV BoundVars a
{-# INLINE addBndrFV #-}
addBndrFV :: forall a. TyCoVar -> FV BoundVars a -> FV BoundVars a
addBndrFV TyCoVar
tcv = (BoundVars -> BoundVars) -> FV BoundVars a -> FV BoundVars a
forall env a. (env -> env) -> FV env a -> FV env a
updEnvFV (\BoundVars
bvs -> BoundVars -> TyCoVar -> BoundVars
extendVarSet BoundVars
bvs TyCoVar
tcv)
addBndrsFV :: [Var] -> FV BoundVars a -> FV BoundVars a
addBndrsFV :: forall a. [TyCoVar] -> FV BoundVars a -> FV BoundVars a
addBndrsFV [TyCoVar]
tcvs = (BoundVars -> BoundVars) -> FV BoundVars a -> FV BoundVars a
forall env a. (env -> env) -> FV env a -> FV env a
updEnvFV (\BoundVars
bvs -> BoundVars -> [TyCoVar] -> BoundVars
extendVarSetList BoundVars
bvs [TyCoVar]
tcvs)
addBndrSelectiveFV :: TyCoVar -> FV (BoundVars, f) a -> FV (BoundVars, f) a
addBndrSelectiveFV :: forall f a. TyCoVar -> FV (BoundVars, f) a -> FV (BoundVars, f) a
addBndrSelectiveFV TyCoVar
tcv
= ((BoundVars, f) -> (BoundVars, f))
-> FV (BoundVars, f) a -> FV (BoundVars, f) a
forall env a. (env -> env) -> FV env a -> FV env a
updEnvFV (\(BoundVars
bvs,f
f) -> let !bvs' :: BoundVars
bvs' = BoundVars -> TyCoVar -> BoundVars
extendVarSet BoundVars
bvs TyCoVar
tcv
in (BoundVars
bvs',f
f))
addBndrsSelectiveFV :: [Var] -> FV (BoundVars, f) a -> FV (BoundVars, f) a
[TyCoVar]
bs
= ((BoundVars, f) -> (BoundVars, f))
-> FV (BoundVars, f) a -> FV (BoundVars, f) a
forall env a. (env -> env) -> FV env a -> FV env a
updEnvFV (\(BoundVars
bvs,f
f) -> let !bvs' :: BoundVars
bvs' = BoundVars -> [TyCoVar] -> BoundVars
extendVarSetList BoundVars
bvs [TyCoVar]
bs
in (BoundVars
bvs',f
f))
mapUnionFV :: (Foldable t, Monoid acc)
=> (a -> FV env acc) -> t a -> FV env acc
{-# INLINE mapUnionFV #-}
mapUnionFV :: forall (t :: * -> *) acc a env.
(Foldable t, Monoid acc) =>
(a -> FV env acc) -> t a -> FV env acc
mapUnionFV a -> FV env acc
f t a
xs = (a -> FV env acc -> FV env acc) -> FV env acc -> t a -> FV env acc
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (FV env acc -> FV env acc -> FV env acc
forall a. Monoid a => a -> a -> a
mappend (FV env acc -> FV env acc -> FV env acc)
-> (a -> FV env acc) -> a -> FV env acc -> FV env acc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> FV env acc
f) FV env acc
forall a. Monoid a => a
mempty t a
xs
runFVTop :: FV BoundVars a -> a
{-# INLINE runFVTop #-}
runFVTop :: forall a. FV BoundVars a -> a
runFVTop FV BoundVars a
f = FV BoundVars a -> BoundVars -> a
forall env acc. FV env acc -> env -> acc
runFV FV BoundVars a
f (BoundVars
emptyVarSet :: BoundVars)
runFVAcc :: FV BoundVars (EndoOS a) -> a -> a
{-# INLINE runFVAcc #-}
runFVAcc :: forall a. FV BoundVars (EndoOS a) -> a -> a
runFVAcc FV BoundVars (EndoOS a)
f = EndoOS a -> a -> a
forall a. EndoOS a -> a -> a
runEndoOS (FV BoundVars (EndoOS a) -> EndoOS a
forall a. FV BoundVars a -> a
runFVTop FV BoundVars (EndoOS a)
f)
runTyCoVars :: TyCoFV -> TyCoVarSet
{-# INLINE runTyCoVars #-}
runTyCoVars :: TyCoFV -> BoundVars
runTyCoVars TyCoFV
f = TyCoFV -> BoundVars -> BoundVars
forall a. FV BoundVars (EndoOS a) -> a -> a
runFVAcc TyCoFV
f BoundVars
emptyVarSet
runTyCoVarsDSet :: DTyCoFV -> DTyCoVarSet
{-# INLINE runTyCoVarsDSet #-}
runTyCoVarsDSet :: DTyCoFV -> DTyCoVarSet
runTyCoVarsDSet DTyCoFV
f = DTyCoFV -> DTyCoVarSet -> DTyCoVarSet
forall a. FV BoundVars (EndoOS a) -> a -> a
runFVAcc DTyCoFV
f DTyCoVarSet
emptyDVarSet
runFVSelective :: InterestingVarFun -> SelectiveDFV -> DVarSet
runFVSelective :: InterestingVarFun -> SelectiveDFV -> DTyCoVarSet
runFVSelective InterestingVarFun
interesting SelectiveDFV
f
= EndoOS DTyCoVarSet -> DTyCoVarSet -> DTyCoVarSet
forall a. EndoOS a -> a -> a
runEndoOS (SelectiveDFV
-> (BoundVars, InterestingVarFun) -> EndoOS DTyCoVarSet
forall env acc. FV env acc -> env -> acc
runFV SelectiveDFV
f (BoundVars
emptyVarSet, InterestingVarFun
interesting)) DTyCoVarSet
emptyDVarSet
runFVSelectiveList :: InterestingVarFun -> SelectiveDFV -> [Var]
runFVSelectiveList :: InterestingVarFun -> SelectiveDFV -> [TyCoVar]
runFVSelectiveList InterestingVarFun
interesting SelectiveDFV
f = DTyCoVarSet -> [TyCoVar]
dVarSetElems (InterestingVarFun -> SelectiveDFV -> DTyCoVarSet
runFVSelective InterestingVarFun
interesting SelectiveDFV
f)
runFVSelectiveSet :: InterestingVarFun -> SelectiveDFV -> VarSet
runFVSelectiveSet :: InterestingVarFun -> SelectiveDFV -> BoundVars
runFVSelectiveSet InterestingVarFun
interesting SelectiveDFV
f = DTyCoVarSet -> BoundVars
dVarSetToVarSet (InterestingVarFun -> SelectiveDFV -> DTyCoVarSet
runFVSelective InterestingVarFun
interesting SelectiveDFV
f)