{-# LANGUAGE PatternSynonyms #-}
module GHC.Types.Var.FV (
FV( runFV, MkFV ),
BoundVars, VarSetFV, DVarSetFV, SelectiveDFV,
TyCoFV, DTyCoFV,
runFVTop, runFVAcc, runTyCoVars, runTyCoVarsDSet,
runFVSelective, runFVSelectiveList, runFVSelectiveSet,
InterestingVarFun,
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 (InterestingVarFun, BoundVars) (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 -> acc
f)
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)
upd_bndrs_fv :: (env -> env) -> FV env a -> FV env a
{-# INLINE addBndrFV #-}
upd_bndrs_fv :: forall env a. (env -> env) -> FV env a -> FV env a
upd_bndrs_fv 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
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
upd_bndrs_fv (\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
upd_bndrs_fv (\BoundVars
bvs -> BoundVars -> [TyCoVar] -> BoundVars
extendVarSetList BoundVars
bvs [TyCoVar]
tcvs)
addBndrSelectiveFV :: TyCoVar -> FV (f, BoundVars) a -> FV (f, BoundVars) a
addBndrSelectiveFV :: forall f a. TyCoVar -> FV (f, BoundVars) a -> FV (f, BoundVars) a
addBndrSelectiveFV TyCoVar
tcv
= ((f, BoundVars) -> (f, BoundVars))
-> FV (f, BoundVars) a -> FV (f, BoundVars) a
forall env a. (env -> env) -> FV env a -> FV env a
upd_bndrs_fv (\(f
f,BoundVars
bvs) -> let !bvs' :: BoundVars
bvs' = BoundVars -> TyCoVar -> BoundVars
extendVarSet BoundVars
bvs TyCoVar
tcv
in (f
f,BoundVars
bvs'))
addBndrsSelectiveFV :: [Var] -> FV (f, BoundVars) a -> FV (f, BoundVars) a
[TyCoVar]
bs
= ((f, BoundVars) -> (f, BoundVars))
-> FV (f, BoundVars) a -> FV (f, BoundVars) a
forall env a. (env -> env) -> FV env a -> FV env a
upd_bndrs_fv (\(f
f,BoundVars
bvs) -> let !bvs' :: BoundVars
bvs' = BoundVars -> [TyCoVar] -> BoundVars
extendVarSetList BoundVars
bvs [TyCoVar]
bs
in (f
f,BoundVars
bvs'))
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
-> (InterestingVarFun, BoundVars) -> EndoOS DTyCoVarSet
forall env acc. FV env acc -> env -> acc
runFV SelectiveDFV
f (InterestingVarFun
interesting, BoundVars
emptyVarSet)) 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)