{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
module Clash.Core.VarEnv
(
VarEnv
, nullVarEnv
, lookupVarEnv
, lookupVarEnv'
, lookupVarEnvDirectly
, emptyVarEnv
, unitVarEnv
, mkVarEnv
, extendVarEnv
, extendVarEnvList
, extendVarEnvWith
, delVarEnv
, delVarEnvList
, unionVarEnv
, unionVarEnvWith
, mapVarEnv
, mapMaybeVarEnv
, foldlWithUniqueVarEnv'
, elemVarEnv
, notElemVarEnv
, eltsVarEnv
, VarSet
, emptyVarSet
, unitVarSet
, delVarSetByKey
, unionVarSet
, differenceVarSet
, nullVarSet
, elemVarSet
, notElemVarSet
, subsetVarSet
, disjointVarSet
, mkVarSet
, eltsVarSet
, InScopeSet
, emptyInScopeSet
, lookupInScope
, mkInScopeSet
, extendInScopeSet
, extendInScopeSetList
, unionInScope
, elemInScopeSet
, elemUniqInScopeSet
, notElemInScopeSet
, varSetInScope
, uniqAway
, uniqAway'
, RnEnv
, mkRnEnv
, rnTmBndr
, rnTyBndr
, rnTmBndrs
, rnTyBndrs
, rnOccLId
, rnOccRId
, rnOccLTy
, rnOccRTy
)
where
import Control.DeepSeq (NFData)
import Data.Binary (Binary)
import Data.Coerce (coerce)
import qualified Data.List as List
import qualified Data.List.Extra as List
import Data.Maybe (fromMaybe)
#if MIN_VERSION_prettyprinter(1,7,0)
import Prettyprinter
#else
import Data.Text.Prettyprint.Doc
#endif
import GHC.Exts (Any)
import GHC.Generics (Generic)
import GHC.Stack (HasCallStack)
import Clash.Core.Pretty ()
import Clash.Core.Var
import Clash.Debug (debugIsOn)
import Clash.Unique
import Clash.Util
import Clash.Pretty
type VarEnv a = UniqMap a
emptyVarEnv
:: VarEnv a
emptyVarEnv :: forall a. VarEnv a
emptyVarEnv = UniqMap a
forall a. VarEnv a
emptyUniqMap
unitVarEnv
:: Var b
-> a
-> VarEnv a
unitVarEnv :: forall b a. Var b -> a -> VarEnv a
unitVarEnv = Var b -> a -> UniqMap a
forall a b. Uniquable a => a -> b -> UniqMap b
unitUniqMap
lookupVarEnv
:: Var b
-> VarEnv a
-> Maybe a
lookupVarEnv :: forall b a. Var b -> VarEnv a -> Maybe a
lookupVarEnv = Var b -> UniqMap a -> Maybe a
forall a b. Uniquable a => a -> UniqMap b -> Maybe b
lookupUniqMap
lookupVarEnvDirectly
:: Unique
-> VarEnv a
-> Maybe a
lookupVarEnvDirectly :: forall a. Int -> VarEnv a -> Maybe a
lookupVarEnvDirectly = Int -> UniqMap a -> Maybe a
forall a b. Uniquable a => a -> UniqMap b -> Maybe b
lookupUniqMap
lookupVarEnv'
:: HasCallStack
=> VarEnv a
-> Var b
-> a
lookupVarEnv' :: forall a b. HasCallStack => VarEnv a -> Var b -> a
lookupVarEnv' = UniqMap a -> Var b -> a
forall a b. (HasCallStack, Uniquable a) => UniqMap b -> a -> b
lookupUniqMap'
delVarEnv
:: VarEnv a
-> Var b
-> VarEnv a
delVarEnv :: forall a b. VarEnv a -> Var b -> VarEnv a
delVarEnv = UniqMap a -> Var b -> UniqMap a
forall a b. Uniquable a => UniqMap b -> a -> UniqMap b
delUniqMap
delVarEnvList
:: VarEnv a
-> [Var b]
-> VarEnv a
delVarEnvList :: forall a b. VarEnv a -> [Var b] -> VarEnv a
delVarEnvList = UniqMap a -> [Var b] -> UniqMap a
forall a b. Uniquable a => UniqMap b -> [a] -> UniqMap b
delListUniqMap
extendVarEnv
:: Var b
-> a
-> VarEnv a
-> VarEnv a
extendVarEnv :: forall b a. Var b -> a -> VarEnv a -> VarEnv a
extendVarEnv = Var b -> a -> UniqMap a -> UniqMap a
forall a b. Uniquable a => a -> b -> UniqMap b -> UniqMap b
extendUniqMap
extendVarEnvWith
:: Var b
-> a
-> (a -> a -> a)
-> VarEnv a
-> VarEnv a
extendVarEnvWith :: forall b a. Var b -> a -> (a -> a -> a) -> VarEnv a -> VarEnv a
extendVarEnvWith = Var b -> a -> (a -> a -> a) -> UniqMap a -> UniqMap a
forall a b.
Uniquable a =>
a -> b -> (b -> b -> b) -> UniqMap b -> UniqMap b
extendUniqMapWith
extendVarEnvList
:: VarEnv a
-> [(Var b, a)]
-> VarEnv a
extendVarEnvList :: forall a b. VarEnv a -> [(Var b, a)] -> VarEnv a
extendVarEnvList = UniqMap a -> [(Var b, a)] -> UniqMap a
forall a b. Uniquable a => UniqMap b -> [(a, b)] -> UniqMap b
extendListUniqMap
nullVarEnv
:: VarEnv a
-> Bool
nullVarEnv :: forall a. VarEnv a -> Bool
nullVarEnv = UniqMap a -> Bool
forall a. VarEnv a -> Bool
nullUniqMap
unionVarEnv
:: VarEnv a
-> VarEnv a
-> VarEnv a
unionVarEnv :: forall a. VarEnv a -> VarEnv a -> VarEnv a
unionVarEnv = UniqMap a -> UniqMap a -> UniqMap a
forall a. VarEnv a -> VarEnv a -> VarEnv a
unionUniqMap
unionVarEnvWith
:: (a -> a -> a)
-> VarEnv a
-> VarEnv a
-> VarEnv a
unionVarEnvWith :: forall a. (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
unionVarEnvWith = (a -> a -> a) -> UniqMap a -> UniqMap a -> UniqMap a
forall a. (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
unionUniqMapWith
mkVarEnv
:: [(Var a,b)]
-> VarEnv b
mkVarEnv :: forall a b. [(Var a, b)] -> VarEnv b
mkVarEnv = [(Var a, b)] -> UniqMap b
forall a b. Uniquable a => [(a, b)] -> UniqMap b
listToUniqMap
mapVarEnv
:: (a -> b)
-> VarEnv a
-> VarEnv b
mapVarEnv :: forall a b. (a -> b) -> VarEnv a -> VarEnv b
mapVarEnv = (a -> b) -> UniqMap a -> UniqMap b
forall a b. (a -> b) -> VarEnv a -> VarEnv b
mapUniqMap
mapMaybeVarEnv
:: (a -> Maybe b)
-> VarEnv a
-> VarEnv b
mapMaybeVarEnv :: forall a b. (a -> Maybe b) -> VarEnv a -> VarEnv b
mapMaybeVarEnv = (a -> Maybe b) -> UniqMap a -> UniqMap b
forall a b. (a -> Maybe b) -> VarEnv a -> VarEnv b
mapMaybeUniqMap
foldlWithUniqueVarEnv'
:: (a -> Unique -> b -> a)
-> a
-> VarEnv b
-> a
foldlWithUniqueVarEnv' :: forall a b. (a -> Int -> b -> a) -> a -> VarEnv b -> a
foldlWithUniqueVarEnv' = (a -> Int -> b -> a) -> a -> UniqMap b -> a
forall a b. (a -> Int -> b -> a) -> a -> VarEnv b -> a
foldlWithUnique'
eltsVarEnv
:: VarEnv a
-> [a]
eltsVarEnv :: forall a. VarEnv a -> [a]
eltsVarEnv = UniqMap a -> [a]
forall a. VarEnv a -> [a]
eltsUniqMap
elemVarEnv
:: Var a
-> VarEnv b
-> Bool
elemVarEnv :: forall a b. Var a -> VarEnv b -> Bool
elemVarEnv = Var a -> UniqMap b -> Bool
forall a b. Uniquable a => a -> UniqMap b -> Bool
elemUniqMap
notElemVarEnv
:: Var a
-> VarEnv b
-> Bool
notElemVarEnv :: forall a b. Var a -> VarEnv b -> Bool
notElemVarEnv = Var a -> UniqMap b -> Bool
forall a b. Uniquable a => a -> UniqMap b -> Bool
notElemUniqMap
type VarSet = UniqSet (Var Any)
emptyVarSet
:: VarSet
emptyVarSet :: UniqSet (Var Any)
emptyVarSet = UniqSet (Var Any)
forall a. UniqSet a
emptyUniqSet
unitVarSet
:: Var a
-> VarSet
unitVarSet :: forall a. Var a -> UniqSet (Var Any)
unitVarSet Var a
v = Var Any -> UniqSet (Var Any)
forall a. Uniquable a => a -> UniqSet a
unitUniqSet (Var a -> Var Any
coerce Var a
v)
extendVarSet
:: VarSet
-> Var a
-> VarSet
extendVarSet :: forall a. UniqSet (Var Any) -> Var a -> UniqSet (Var Any)
extendVarSet UniqSet (Var Any)
env Var a
v = UniqSet (Var Any) -> Var Any -> UniqSet (Var Any)
forall a. Uniquable a => UniqSet a -> a -> UniqSet a
extendUniqSet UniqSet (Var Any)
env (Var a -> Var Any
coerce Var a
v)
unionVarSet
:: VarSet
-> VarSet
-> VarSet
unionVarSet :: UniqSet (Var Any) -> UniqSet (Var Any) -> UniqSet (Var Any)
unionVarSet = UniqSet (Var Any) -> UniqSet (Var Any) -> UniqSet (Var Any)
forall a. UniqSet a -> UniqSet a -> UniqSet a
unionUniqSet
differenceVarSet
:: VarSet
-> VarSet
-> VarSet
differenceVarSet :: UniqSet (Var Any) -> UniqSet (Var Any) -> UniqSet (Var Any)
differenceVarSet = UniqSet (Var Any) -> UniqSet (Var Any) -> UniqSet (Var Any)
forall a. UniqSet a -> UniqSet a -> UniqSet a
differenceUniqSet
elemVarSet
:: Var a
-> VarSet
-> Bool
elemVarSet :: forall a. Var a -> UniqSet (Var Any) -> Bool
elemVarSet Var a
v = Var Any -> UniqSet (Var Any) -> Bool
forall a. Uniquable a => a -> UniqSet a -> Bool
elemUniqSet (Var a -> Var Any
coerce Var a
v)
notElemVarSet
:: Var a
-> VarSet
-> Bool
notElemVarSet :: forall a. Var a -> UniqSet (Var Any) -> Bool
notElemVarSet Var a
v = Var Any -> UniqSet (Var Any) -> Bool
forall a. Uniquable a => a -> UniqSet a -> Bool
notElemUniqSet (Var a -> Var Any
coerce Var a
v)
subsetVarSet
:: VarSet
-> VarSet
-> Bool
subsetVarSet :: UniqSet (Var Any) -> UniqSet (Var Any) -> Bool
subsetVarSet = UniqSet (Var Any) -> UniqSet (Var Any) -> Bool
forall a. UniqSet a -> UniqSet a -> Bool
subsetUniqSet
disjointVarSet
:: VarSet
-> VarSet
-> Bool
disjointVarSet :: UniqSet (Var Any) -> UniqSet (Var Any) -> Bool
disjointVarSet = UniqSet (Var Any) -> UniqSet (Var Any) -> Bool
forall a. UniqSet a -> UniqSet a -> Bool
disjointUniqSet
nullVarSet
:: VarSet
-> Bool
nullVarSet :: UniqSet (Var Any) -> Bool
nullVarSet = UniqSet (Var Any) -> Bool
forall a. UniqSet a -> Bool
nullUniqSet
lookupVarSet
:: Var a
-> VarSet
-> Maybe (Var Any)
lookupVarSet :: forall a. Var a -> UniqSet (Var Any) -> Maybe (Var Any)
lookupVarSet = Var a -> UniqSet (Var Any) -> Maybe (Var Any)
forall a b. Uniquable a => a -> UniqSet b -> Maybe b
lookupUniqSet
delVarSetByKey
:: Unique
-> VarSet
-> VarSet
delVarSetByKey :: Int -> UniqSet (Var Any) -> UniqSet (Var Any)
delVarSetByKey = Int -> UniqSet (Var Any) -> UniqSet (Var Any)
forall b. Int -> UniqSet b -> UniqSet b
delUniqSetDirectly
mkVarSet
:: [Var a]
-> VarSet
mkVarSet :: forall a. [Var a] -> UniqSet (Var Any)
mkVarSet [Var a]
xs = [Var Any] -> UniqSet (Var Any)
forall a. Uniquable a => [a] -> UniqSet a
mkUniqSet ([Var a] -> [Var Any]
coerce [Var a]
xs)
eltsVarSet
:: VarSet
-> [Var Any]
eltsVarSet :: UniqSet (Var Any) -> [Var Any]
eltsVarSet = UniqSet (Var Any) -> [Var Any]
forall a. UniqSet a -> [a]
eltsUniqSet
data InScopeSet = InScopeSet VarSet {-# UNPACK #-} !Int
deriving ((forall x. InScopeSet -> Rep InScopeSet x)
-> (forall x. Rep InScopeSet x -> InScopeSet) -> Generic InScopeSet
forall x. Rep InScopeSet x -> InScopeSet
forall x. InScopeSet -> Rep InScopeSet x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InScopeSet x -> InScopeSet
$cfrom :: forall x. InScopeSet -> Rep InScopeSet x
Generic, InScopeSet -> ()
(InScopeSet -> ()) -> NFData InScopeSet
forall a. (a -> ()) -> NFData a
rnf :: InScopeSet -> ()
$crnf :: InScopeSet -> ()
NFData, Get InScopeSet
[InScopeSet] -> Put
InScopeSet -> Put
(InScopeSet -> Put)
-> Get InScopeSet -> ([InScopeSet] -> Put) -> Binary InScopeSet
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [InScopeSet] -> Put
$cputList :: [InScopeSet] -> Put
get :: Get InScopeSet
$cget :: Get InScopeSet
put :: InScopeSet -> Put
$cput :: InScopeSet -> Put
Binary)
instance ClashPretty InScopeSet where
clashPretty :: InScopeSet -> Doc ()
clashPretty (InScopeSet UniqSet (Var Any)
s Int
_) = UniqSet (Var Any) -> Doc ()
forall a. ClashPretty a => a -> Doc ()
clashPretty UniqSet (Var Any)
s
extendInScopeSet
:: InScopeSet
-> Var a
-> InScopeSet
extendInScopeSet :: forall a. InScopeSet -> Var a -> InScopeSet
extendInScopeSet (InScopeSet UniqSet (Var Any)
inScope Int
n) Var a
v =
UniqSet (Var Any) -> Int -> InScopeSet
InScopeSet (UniqSet (Var Any) -> Var a -> UniqSet (Var Any)
forall a. UniqSet (Var Any) -> Var a -> UniqSet (Var Any)
extendVarSet UniqSet (Var Any)
inScope Var a
v) (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
extendInScopeSetList
:: InScopeSet
-> [Var a]
-> InScopeSet
extendInScopeSetList :: forall a. InScopeSet -> [Var a] -> InScopeSet
extendInScopeSetList (InScopeSet UniqSet (Var Any)
inScope Int
n) [Var a]
vs =
UniqSet (Var Any) -> Int -> InScopeSet
InScopeSet ((UniqSet (Var Any) -> Var a -> UniqSet (Var Any))
-> UniqSet (Var Any) -> [Var a] -> UniqSet (Var Any)
forall (t :: Type -> Type) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' UniqSet (Var Any) -> Var a -> UniqSet (Var Any)
forall a. UniqSet (Var Any) -> Var a -> UniqSet (Var Any)
extendVarSet UniqSet (Var Any)
inScope [Var a]
vs) (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [Var a] -> Int
forall (t :: Type -> Type) a. Foldable t => t a -> Int
length [Var a]
vs)
unionInScope
:: InScopeSet
-> InScopeSet
-> InScopeSet
unionInScope :: InScopeSet -> InScopeSet -> InScopeSet
unionInScope (InScopeSet UniqSet (Var Any)
s1 Int
_) (InScopeSet UniqSet (Var Any)
s2 Int
n2)
= UniqSet (Var Any) -> Int -> InScopeSet
InScopeSet (UniqSet (Var Any)
s1 UniqSet (Var Any) -> UniqSet (Var Any) -> UniqSet (Var Any)
`unionVarSet` UniqSet (Var Any)
s2) Int
n2
varSetInScope
:: VarSet
-> InScopeSet
-> Bool
varSetInScope :: UniqSet (Var Any) -> InScopeSet -> Bool
varSetInScope UniqSet (Var Any)
vars (InScopeSet UniqSet (Var Any)
s1 Int
_)
= UniqSet (Var Any)
vars UniqSet (Var Any) -> UniqSet (Var Any) -> Bool
`subsetVarSet` UniqSet (Var Any)
s1
lookupInScope
:: InScopeSet
-> Var a
-> Maybe (Var Any)
lookupInScope :: forall a. InScopeSet -> Var a -> Maybe (Var Any)
lookupInScope (InScopeSet UniqSet (Var Any)
s Int
_) Var a
v = Var a -> UniqSet (Var Any) -> Maybe (Var Any)
forall a. Var a -> UniqSet (Var Any) -> Maybe (Var Any)
lookupVarSet Var a
v UniqSet (Var Any)
s
elemInScopeSet
:: Var a
-> InScopeSet
-> Bool
elemInScopeSet :: forall a. Var a -> InScopeSet -> Bool
elemInScopeSet Var a
v (InScopeSet UniqSet (Var Any)
s Int
_) = Var a -> UniqSet (Var Any) -> Bool
forall a. Var a -> UniqSet (Var Any) -> Bool
elemVarSet Var a
v UniqSet (Var Any)
s
elemUniqInScopeSet
:: Unique
-> InScopeSet
-> Bool
elemUniqInScopeSet :: Int -> InScopeSet -> Bool
elemUniqInScopeSet Int
u (InScopeSet UniqSet (Var Any)
s Int
_) = Int
u Int -> UniqSet (Var Any) -> Bool
forall a. Int -> UniqSet a -> Bool
`elemUniqSetDirectly` UniqSet (Var Any)
s
notElemInScopeSet
:: Var a
-> InScopeSet
-> Bool
notElemInScopeSet :: forall a. Var a -> InScopeSet -> Bool
notElemInScopeSet Var a
v (InScopeSet UniqSet (Var Any)
s Int
_) = Var a -> UniqSet (Var Any) -> Bool
forall a. Var a -> UniqSet (Var Any) -> Bool
notElemVarSet Var a
v UniqSet (Var Any)
s
mkInScopeSet
:: VarSet
-> InScopeSet
mkInScopeSet :: UniqSet (Var Any) -> InScopeSet
mkInScopeSet UniqSet (Var Any)
is = UniqSet (Var Any) -> Int -> InScopeSet
InScopeSet UniqSet (Var Any)
is Int
1
emptyInScopeSet
:: InScopeSet
emptyInScopeSet :: InScopeSet
emptyInScopeSet = UniqSet (Var Any) -> InScopeSet
mkInScopeSet UniqSet (Var Any)
emptyVarSet
uniqAway
:: (Uniquable a, ClashPretty a)
=> InScopeSet
-> a
-> a
uniqAway :: forall a. (Uniquable a, ClashPretty a) => InScopeSet -> a -> a
uniqAway (InScopeSet UniqSet (Var Any)
set Int
n) a
a =
(Int -> Bool) -> Int -> a -> a
forall a.
(Uniquable a, ClashPretty a) =>
(Int -> Bool) -> Int -> a -> a
uniqAway' (Int -> UniqSet (Var Any) -> Bool
forall a. Int -> UniqSet a -> Bool
`elemUniqSetDirectly` UniqSet (Var Any)
set) Int
n a
a
uniqAway'
:: (Uniquable a, ClashPretty a)
=> (Unique -> Bool)
-> Int
-> a
-> a
uniqAway' :: forall a.
(Uniquable a, ClashPretty a) =>
(Int -> Bool) -> Int -> a -> a
uniqAway' Int -> Bool
inScopeTest Int
n a
u =
if Int -> Bool
inScopeTest (a -> Int
forall a. Uniquable a => a -> Int
getUnique a
u) then
Int -> a
try Int
1
else
a
u
where
origUniq :: Int
origUniq = a -> Int
forall a. Uniquable a => a -> Int
getUnique a
u
try :: Int -> a
try Int
k
| Bool
debugIsOn Bool -> Bool -> Bool
&& Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1000
= String -> Doc () -> a
forall ann a. String -> Doc ann -> a
pprPanic String
"uniqAway loop:" Doc ()
msg
| Int -> Bool
inScopeTest Int
uniq
= Int -> a
try (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
3
= String -> Doc () -> a -> a
forall ann a. String -> Doc ann -> a -> a
pprTraceDebug String
"uniqAway:" Doc ()
msg (a -> Int -> a
forall a. Uniquable a => a -> Int -> a
setUnique a
u Int
uniq)
| Bool
otherwise
= a -> Int -> a
forall a. Uniquable a => a -> Int -> a
setUnique a
u Int
uniq
where
msg :: Doc ()
msg = Int -> Doc ()
forall a. Pretty a => a -> Doc ()
fromPretty Int
k Doc () -> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ()
"tries" Doc () -> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann -> Doc ann
<+> a -> Doc ()
forall a. ClashPretty a => a -> Doc ()
clashPretty a
u Doc () -> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Doc ()
forall a. Pretty a => a -> Doc ()
fromPretty Int
n
uniq :: Int
uniq = Int -> Int -> Int
deriveUnique Int
origUniq (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
k)
deriveUnique
:: Unique
-> Int
-> Unique
deriveUnique :: Int -> Int -> Int
deriveUnique Int
i Int
delta = Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
delta
data RnEnv
= RnEnv
{ RnEnv -> VarEnv TyVar
rn_envLTy :: VarEnv TyVar
, RnEnv -> VarEnv Id
rn_envLTm :: VarEnv Id
, RnEnv -> VarEnv TyVar
rn_envRTy :: VarEnv TyVar
, RnEnv -> VarEnv Id
rn_envRTm :: VarEnv Id
, RnEnv -> InScopeSet
rn_inScope :: InScopeSet
}
mkRnEnv
:: InScopeSet -> RnEnv
mkRnEnv :: InScopeSet -> RnEnv
mkRnEnv InScopeSet
vars
= RnEnv :: VarEnv TyVar
-> VarEnv Id -> VarEnv TyVar -> VarEnv Id -> InScopeSet -> RnEnv
RnEnv
{ rn_envLTy :: VarEnv TyVar
rn_envLTy = VarEnv TyVar
forall a. VarEnv a
emptyVarEnv
, rn_envLTm :: VarEnv Id
rn_envLTm = VarEnv Id
forall a. VarEnv a
emptyVarEnv
, rn_envRTy :: VarEnv TyVar
rn_envRTy = VarEnv TyVar
forall a. VarEnv a
emptyVarEnv
, rn_envRTm :: VarEnv Id
rn_envRTm = VarEnv Id
forall a. VarEnv a
emptyVarEnv
, rn_inScope :: InScopeSet
rn_inScope = InScopeSet
vars
}
rnOccLTy
:: RnEnv -> TyVar -> TyVar
rnOccLTy :: RnEnv -> TyVar -> TyVar
rnOccLTy RnEnv
rn TyVar
v = TyVar -> Maybe TyVar -> TyVar
forall a. a -> Maybe a -> a
fromMaybe TyVar
v (TyVar -> VarEnv TyVar -> Maybe TyVar
forall b a. Var b -> VarEnv a -> Maybe a
lookupVarEnv TyVar
v (RnEnv -> VarEnv TyVar
rn_envLTy RnEnv
rn))
rnOccRTy
:: RnEnv -> TyVar -> TyVar
rnOccRTy :: RnEnv -> TyVar -> TyVar
rnOccRTy RnEnv
rn TyVar
v = TyVar -> Maybe TyVar -> TyVar
forall a. a -> Maybe a -> a
fromMaybe TyVar
v (TyVar -> VarEnv TyVar -> Maybe TyVar
forall b a. Var b -> VarEnv a -> Maybe a
lookupVarEnv TyVar
v (RnEnv -> VarEnv TyVar
rn_envRTy RnEnv
rn))
rnTyBndr
:: RnEnv -> TyVar -> TyVar -> RnEnv
rnTyBndr :: RnEnv -> TyVar -> TyVar -> RnEnv
rnTyBndr rv :: RnEnv
rv@(RnEnv {rn_envLTy :: RnEnv -> VarEnv TyVar
rn_envLTy = VarEnv TyVar
lenv, rn_envRTy :: RnEnv -> VarEnv TyVar
rn_envRTy = VarEnv TyVar
renv, rn_inScope :: RnEnv -> InScopeSet
rn_inScope = InScopeSet
inScope}) TyVar
bL TyVar
bR =
RnEnv
rv { rn_envLTy :: VarEnv TyVar
rn_envLTy = TyVar -> TyVar -> VarEnv TyVar -> VarEnv TyVar
forall b a. Var b -> a -> VarEnv a -> VarEnv a
extendVarEnv TyVar
bL TyVar
newB VarEnv TyVar
lenv
, rn_envRTy :: VarEnv TyVar
rn_envRTy = TyVar -> TyVar -> VarEnv TyVar -> VarEnv TyVar
forall b a. Var b -> a -> VarEnv a -> VarEnv a
extendVarEnv TyVar
bR TyVar
newB VarEnv TyVar
renv
, rn_inScope :: InScopeSet
rn_inScope = InScopeSet -> TyVar -> InScopeSet
forall a. InScopeSet -> Var a -> InScopeSet
extendInScopeSet InScopeSet
inScope TyVar
newB }
where
newB :: TyVar
newB | Bool -> Bool
not (TyVar
bL TyVar -> InScopeSet -> Bool
forall a. Var a -> InScopeSet -> Bool
`elemInScopeSet` InScopeSet
inScope) = TyVar
bL
| Bool -> Bool
not (TyVar
bR TyVar -> InScopeSet -> Bool
forall a. Var a -> InScopeSet -> Bool
`elemInScopeSet` InScopeSet
inScope) = TyVar
bR
| Bool
otherwise = InScopeSet -> TyVar -> TyVar
forall a. (Uniquable a, ClashPretty a) => InScopeSet -> a -> a
uniqAway InScopeSet
inScope TyVar
bL
rnTyBndrs
:: RnEnv -> [TyVar] -> [TyVar] -> RnEnv
rnTyBndrs :: RnEnv -> [TyVar] -> [TyVar] -> RnEnv
rnTyBndrs RnEnv
env [TyVar]
tvs1 [TyVar]
tvs2 =
(RnEnv -> (TyVar, TyVar) -> RnEnv)
-> RnEnv -> [(TyVar, TyVar)] -> RnEnv
forall (t :: Type -> Type) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\RnEnv
s (TyVar
l,TyVar
r) -> RnEnv -> TyVar -> TyVar -> RnEnv
rnTyBndr RnEnv
s TyVar
l TyVar
r) RnEnv
env ([TyVar] -> [TyVar] -> [(TyVar, TyVar)]
forall a b. [a] -> [b] -> [(a, b)]
List.zipEqual [TyVar]
tvs1 [TyVar]
tvs2)
rnOccLId
:: RnEnv -> Id -> Id
rnOccLId :: RnEnv -> Id -> Id
rnOccLId RnEnv
rn Id
v = Id -> Maybe Id -> Id
forall a. a -> Maybe a -> a
fromMaybe Id
v (Id -> VarEnv Id -> Maybe Id
forall b a. Var b -> VarEnv a -> Maybe a
lookupVarEnv Id
v (RnEnv -> VarEnv Id
rn_envLTm RnEnv
rn))
rnOccRId
:: RnEnv -> Id -> Id
rnOccRId :: RnEnv -> Id -> Id
rnOccRId RnEnv
rn Id
v = Id -> Maybe Id -> Id
forall a. a -> Maybe a -> a
fromMaybe Id
v (Id -> VarEnv Id -> Maybe Id
forall b a. Var b -> VarEnv a -> Maybe a
lookupVarEnv Id
v (RnEnv -> VarEnv Id
rn_envRTm RnEnv
rn))
rnTmBndr
:: RnEnv -> Id -> Id -> RnEnv
rnTmBndr :: RnEnv -> Id -> Id -> RnEnv
rnTmBndr rv :: RnEnv
rv@(RnEnv {rn_envLTm :: RnEnv -> VarEnv Id
rn_envLTm = VarEnv Id
lenv, rn_envRTm :: RnEnv -> VarEnv Id
rn_envRTm = VarEnv Id
renv, rn_inScope :: RnEnv -> InScopeSet
rn_inScope = InScopeSet
inScope}) Id
bL Id
bR =
RnEnv
rv { rn_envLTm :: VarEnv Id
rn_envLTm = Id -> Id -> VarEnv Id -> VarEnv Id
forall b a. Var b -> a -> VarEnv a -> VarEnv a
extendVarEnv Id
bL Id
newB VarEnv Id
lenv
, rn_envRTm :: VarEnv Id
rn_envRTm = Id -> Id -> VarEnv Id -> VarEnv Id
forall b a. Var b -> a -> VarEnv a -> VarEnv a
extendVarEnv Id
bR Id
newB VarEnv Id
renv
, rn_inScope :: InScopeSet
rn_inScope = InScopeSet -> Id -> InScopeSet
forall a. InScopeSet -> Var a -> InScopeSet
extendInScopeSet InScopeSet
inScope Id
newB }
where
newB :: Id
newB | Bool -> Bool
not (Id
bL Id -> InScopeSet -> Bool
forall a. Var a -> InScopeSet -> Bool
`elemInScopeSet` InScopeSet
inScope) = Id
bL
| Bool -> Bool
not (Id
bR Id -> InScopeSet -> Bool
forall a. Var a -> InScopeSet -> Bool
`elemInScopeSet` InScopeSet
inScope) = Id
bR
| Bool
otherwise = InScopeSet -> Id -> Id
forall a. (Uniquable a, ClashPretty a) => InScopeSet -> a -> a
uniqAway InScopeSet
inScope Id
bL
rnTmBndrs
:: RnEnv -> [Id] -> [Id] -> RnEnv
rnTmBndrs :: RnEnv -> [Id] -> [Id] -> RnEnv
rnTmBndrs RnEnv
env [Id]
ids1 [Id]
ids2 =
(RnEnv -> (Id, Id) -> RnEnv) -> RnEnv -> [(Id, Id)] -> RnEnv
forall (t :: Type -> Type) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\RnEnv
s (Id
l,Id
r) -> RnEnv -> Id -> Id -> RnEnv
rnTmBndr RnEnv
s Id
l Id
r) RnEnv
env ([Id] -> [Id] -> [(Id, Id)]
forall a b. [a] -> [b] -> [(a, b)]
List.zipEqual [Id]
ids1 [Id]
ids2)