{-# 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
, differenceVarEnv
, mapVarEnv
, mapMaybeVarEnv
, foldlWithUniqueVarEnv'
, elemVarEnv
, notElemVarEnv
, eltsVarEnv
, VarSet
, emptyVarSet
, unitVarSet
, extendVarSet
, delVarSetByKey
, unionVarSet
, differenceVarSet
, nullVarSet
, elemVarSet
, notElemVarSet
, subsetVarSet
, disjointVarSet
, mkVarSet
, eltsVarSet
, InScopeSet
, emptyInScopeSet
, lookupInScope
, mkInScopeSet
, extendInScopeSet
, extendInScopeSetList
, unionInScope
, elemInScopeSet
, elemUniqInScopeSet
, notElemInScopeSet
, varSetInScope
, uniqAway
, uniqAway'
)
where
#if MIN_VERSION_ghc(9,8,4) || (MIN_VERSION_ghc(9,6,7) && !MIN_VERSION_ghc(9,8,0))
#define UNIQUE_IS_WORD64
#endif
import Control.DeepSeq (NFData)
import Data.Binary (Binary)
import Data.Coerce (coerce)
import qualified Data.List as List
#ifdef UNIQUE_IS_WORD64
import Data.Word (Word64)
#endif
#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.Data.UniqMap (UniqMap)
import qualified Clash.Data.UniqMap as UniqMap
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
UniqMap.empty
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
UniqMap.singleton
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
UniqMap.lookup
lookupVarEnvDirectly
:: Unique
-> VarEnv a
-> Maybe a
lookupVarEnvDirectly :: forall a. Unique -> VarEnv a -> Maybe a
lookupVarEnvDirectly = Unique -> UniqMap a -> Maybe a
forall a b. Uniquable a => a -> UniqMap b -> Maybe b
UniqMap.lookup
lookupVarEnv'
:: HasCallStack
=> VarEnv a
-> Var b
-> a
lookupVarEnv' :: forall a b. HasCallStack => VarEnv a -> Var b -> a
lookupVarEnv' = (Var b -> VarEnv a -> a) -> VarEnv a -> Var b -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Var b -> VarEnv a -> a
forall a b. Uniquable a => a -> UniqMap b -> b
UniqMap.find
delVarEnv
:: VarEnv a
-> Var b
-> VarEnv a
delVarEnv :: forall a b. VarEnv a -> Var b -> VarEnv a
delVarEnv = (Var b -> VarEnv a -> VarEnv a) -> VarEnv a -> Var b -> VarEnv a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Var b -> VarEnv a -> VarEnv a
forall a b. Uniquable a => a -> UniqMap b -> UniqMap b
UniqMap.delete
delVarEnvList
:: VarEnv a
-> [Var b]
-> VarEnv a
delVarEnvList :: forall a b. VarEnv a -> [Var b] -> VarEnv a
delVarEnvList = ([Var b] -> VarEnv a -> VarEnv a)
-> VarEnv a -> [Var b] -> VarEnv a
forall a b c. (a -> b -> c) -> b -> a -> c
flip [Var b] -> VarEnv a -> VarEnv a
forall a b. Uniquable a => [a] -> UniqMap b -> UniqMap b
UniqMap.deleteMany
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
UniqMap.insert
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
k a
v a -> a -> a
f =
(a -> a -> a) -> Var b -> a -> UniqMap a -> UniqMap a
forall a b.
Uniquable a =>
(b -> b -> b) -> a -> b -> UniqMap b -> UniqMap b
UniqMap.insertWith a -> a -> a
f Var b
k a
v
extendVarEnvList
:: VarEnv a
-> [(Var b, a)]
-> VarEnv a
extendVarEnvList :: forall a b. VarEnv a -> [(Var b, a)] -> VarEnv a
extendVarEnvList = ([(Var b, a)] -> VarEnv a -> VarEnv a)
-> VarEnv a -> [(Var b, a)] -> VarEnv a
forall a b c. (a -> b -> c) -> b -> a -> c
flip [(Var b, a)] -> VarEnv a -> VarEnv a
forall a b. Uniquable a => [(a, b)] -> UniqMap b -> UniqMap b
UniqMap.insertMany
nullVarEnv
:: VarEnv a
-> Bool
nullVarEnv :: forall a. VarEnv a -> Bool
nullVarEnv = UniqMap a -> Bool
forall a. VarEnv a -> Bool
UniqMap.null
unionVarEnv
:: VarEnv a
-> VarEnv a
-> VarEnv a
unionVarEnv :: forall a. VarEnv a -> VarEnv a -> VarEnv a
unionVarEnv = VarEnv a -> VarEnv a -> VarEnv a
forall a. Semigroup a => a -> a -> a
(<>)
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
UniqMap.unionWith
differenceVarEnv
:: VarEnv a
-> VarEnv a
-> VarEnv a
differenceVarEnv :: forall a. VarEnv a -> VarEnv a -> VarEnv a
differenceVarEnv = UniqMap a -> UniqMap a -> UniqMap a
forall a. VarEnv a -> VarEnv a -> VarEnv a
UniqMap.difference
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
UniqMap.fromList
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
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap
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
UniqMap.mapMaybe
foldlWithUniqueVarEnv'
:: (a -> Unique -> b -> a)
-> a
-> VarEnv b
-> a
foldlWithUniqueVarEnv' :: forall a b. (a -> Unique -> b -> a) -> a -> VarEnv b -> a
foldlWithUniqueVarEnv' = (a -> Unique -> b -> a) -> a -> UniqMap b -> a
forall a b. (a -> Unique -> b -> a) -> a -> VarEnv b -> a
UniqMap.foldlWithUnique'
eltsVarEnv
:: VarEnv a
-> [a]
eltsVarEnv :: forall a. VarEnv a -> [a]
eltsVarEnv = UniqMap a -> [a]
forall a. VarEnv a -> [a]
UniqMap.elems
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
UniqMap.elem
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
UniqMap.notElem
type VarSet = UniqMap (Var Any)
emptyVarSet
:: VarSet
emptyVarSet :: UniqMap (Var Any)
emptyVarSet = UniqMap (Var Any)
forall a. VarEnv a
UniqMap.empty
unitVarSet
:: Var a
-> VarSet
unitVarSet :: forall a. Var a -> UniqMap (Var Any)
unitVarSet Var a
v = Var Any -> UniqMap (Var Any)
forall a. Uniquable a => a -> UniqMap a
UniqMap.singletonUnique (Var a -> Var Any
forall a b. Coercible a b => a -> b
coerce Var a
v)
extendVarSet
:: VarSet
-> Var a
-> VarSet
extendVarSet :: forall a. UniqMap (Var Any) -> Var a -> UniqMap (Var Any)
extendVarSet UniqMap (Var Any)
env Var a
v = Var Any -> UniqMap (Var Any) -> UniqMap (Var Any)
forall a. Uniquable a => a -> UniqMap a -> UniqMap a
UniqMap.insertUnique (Var a -> Var Any
forall a b. Coercible a b => a -> b
coerce Var a
v) UniqMap (Var Any)
env
unionVarSet
:: VarSet
-> VarSet
-> VarSet
unionVarSet :: UniqMap (Var Any) -> UniqMap (Var Any) -> UniqMap (Var Any)
unionVarSet = UniqMap (Var Any) -> UniqMap (Var Any) -> UniqMap (Var Any)
forall a. Semigroup a => a -> a -> a
(<>)
differenceVarSet
:: VarSet
-> VarSet
-> VarSet
differenceVarSet :: UniqMap (Var Any) -> UniqMap (Var Any) -> UniqMap (Var Any)
differenceVarSet = UniqMap (Var Any) -> UniqMap (Var Any) -> UniqMap (Var Any)
forall a. VarEnv a -> VarEnv a -> VarEnv a
UniqMap.difference
elemVarSet
:: Var a
-> VarSet
-> Bool
elemVarSet :: forall a. Var a -> UniqMap (Var Any) -> Bool
elemVarSet Var a
v = Unique -> UniqMap (Var Any) -> Bool
forall a b. Uniquable a => a -> UniqMap b -> Bool
UniqMap.elem (Var a -> Unique
forall a. Uniquable a => a -> Unique
getUnique Var a
v)
notElemVarSet
:: Var a
-> VarSet
-> Bool
notElemVarSet :: forall a. Var a -> UniqMap (Var Any) -> Bool
notElemVarSet Var a
v = Unique -> UniqMap (Var Any) -> Bool
forall a b. Uniquable a => a -> UniqMap b -> Bool
UniqMap.notElem (Var a -> Unique
forall a. Uniquable a => a -> Unique
getUnique Var a
v)
subsetVarSet
:: VarSet
-> VarSet
-> Bool
subsetVarSet :: UniqMap (Var Any) -> UniqMap (Var Any) -> Bool
subsetVarSet = UniqMap (Var Any) -> UniqMap (Var Any) -> Bool
forall b. UniqMap b -> UniqMap b -> Bool
UniqMap.submap
disjointVarSet
:: VarSet
-> VarSet
-> Bool
disjointVarSet :: UniqMap (Var Any) -> UniqMap (Var Any) -> Bool
disjointVarSet = UniqMap (Var Any) -> UniqMap (Var Any) -> Bool
forall b. UniqMap b -> UniqMap b -> Bool
UniqMap.disjoint
nullVarSet
:: VarSet
-> Bool
nullVarSet :: UniqMap (Var Any) -> Bool
nullVarSet = UniqMap (Var Any) -> Bool
forall a. VarEnv a -> Bool
UniqMap.null
lookupVarSet
:: Var a
-> VarSet
-> Maybe (Var Any)
lookupVarSet :: forall a. Var a -> UniqMap (Var Any) -> Maybe (Var Any)
lookupVarSet = Var a -> UniqMap (Var Any) -> Maybe (Var Any)
forall a b. Uniquable a => a -> UniqMap b -> Maybe b
UniqMap.lookup
delVarSetByKey
:: Unique
-> VarSet
-> VarSet
delVarSetByKey :: Unique -> UniqMap (Var Any) -> UniqMap (Var Any)
delVarSetByKey = Unique -> UniqMap (Var Any) -> UniqMap (Var Any)
forall a b. Uniquable a => a -> UniqMap b -> UniqMap b
UniqMap.delete
mkVarSet
:: [Var a]
-> VarSet
mkVarSet :: forall a. [Var a] -> UniqMap (Var Any)
mkVarSet [Var a]
xs = [(Unique, Var Any)] -> UniqMap (Var Any)
forall a b. Uniquable a => [(a, b)] -> UniqMap b
UniqMap.fromList ([(Unique, Var Any)] -> UniqMap (Var Any))
-> [(Unique, Var Any)] -> UniqMap (Var Any)
forall a b. (a -> b) -> a -> b
$ (Var a -> (Unique, Var Any)) -> [Var a] -> [(Unique, Var Any)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Var a
x -> (Var a -> Unique
forall a. Uniquable a => a -> Unique
getUnique Var a
x, Var a -> Var Any
forall a b. Coercible a b => a -> b
coerce Var a
x)) [Var a]
xs
eltsVarSet
:: VarSet
-> [Var Any]
eltsVarSet :: UniqMap (Var Any) -> [Var Any]
eltsVarSet = UniqMap (Var Any) -> [Var Any]
forall a. VarEnv a -> [a]
UniqMap.elems
type Seed
#ifdef UNIQUE_IS_WORD64
= Word64
#else
= Int
#endif
data InScopeSet = InScopeSet VarSet {-# UNPACK #-} !Seed
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
$cfrom :: forall x. InScopeSet -> Rep InScopeSet x
from :: forall x. InScopeSet -> Rep InScopeSet x
$cto :: forall x. Rep InScopeSet x -> InScopeSet
to :: forall x. Rep InScopeSet x -> InScopeSet
Generic, InScopeSet -> ()
(InScopeSet -> ()) -> NFData InScopeSet
forall a. (a -> ()) -> NFData a
$crnf :: InScopeSet -> ()
rnf :: 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
$cput :: InScopeSet -> Put
put :: InScopeSet -> Put
$cget :: Get InScopeSet
get :: Get InScopeSet
$cputList :: [InScopeSet] -> Put
putList :: [InScopeSet] -> Put
Binary)
instance ClashPretty InScopeSet where
clashPretty :: InScopeSet -> Doc ()
clashPretty (InScopeSet UniqMap (Var Any)
s Unique
_) = UniqMap (Var Any) -> Doc ()
forall a. ClashPretty a => a -> Doc ()
clashPretty UniqMap (Var Any)
s
extendInScopeSet
:: InScopeSet
-> Var a
-> InScopeSet
extendInScopeSet :: forall a. InScopeSet -> Var a -> InScopeSet
extendInScopeSet (InScopeSet UniqMap (Var Any)
inScope Unique
n) Var a
v =
UniqMap (Var Any) -> Unique -> InScopeSet
InScopeSet (UniqMap (Var Any) -> Var a -> UniqMap (Var Any)
forall a. UniqMap (Var Any) -> Var a -> UniqMap (Var Any)
extendVarSet UniqMap (Var Any)
inScope Var a
v) (Unique
n Unique -> Unique -> Unique
forall a. Num a => a -> a -> a
+ Unique
1)
extendInScopeSetList
:: InScopeSet
-> [Var a]
-> InScopeSet
extendInScopeSetList :: forall a. InScopeSet -> [Var a] -> InScopeSet
extendInScopeSetList (InScopeSet UniqMap (Var Any)
inScope Unique
n) [Var a]
vs =
UniqMap (Var Any) -> Unique -> InScopeSet
InScopeSet ((UniqMap (Var Any) -> Var a -> UniqMap (Var Any))
-> UniqMap (Var Any) -> [Var a] -> UniqMap (Var Any)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: Type -> Type) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' UniqMap (Var Any) -> Var a -> UniqMap (Var Any)
forall a. UniqMap (Var Any) -> Var a -> UniqMap (Var Any)
extendVarSet UniqMap (Var Any)
inScope [Var a]
vs) (Unique
n Unique -> Unique -> Unique
forall a. Num a => a -> a -> a
+ Int -> Unique
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Var a] -> Int
forall a. [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 UniqMap (Var Any)
s1 Unique
_) (InScopeSet UniqMap (Var Any)
s2 Unique
n2)
= UniqMap (Var Any) -> Unique -> InScopeSet
InScopeSet (UniqMap (Var Any)
s1 UniqMap (Var Any) -> UniqMap (Var Any) -> UniqMap (Var Any)
`unionVarSet` UniqMap (Var Any)
s2) Unique
n2
varSetInScope
:: VarSet
-> InScopeSet
-> Bool
varSetInScope :: UniqMap (Var Any) -> InScopeSet -> Bool
varSetInScope UniqMap (Var Any)
vars (InScopeSet UniqMap (Var Any)
s1 Unique
_)
= UniqMap (Var Any)
vars UniqMap (Var Any) -> UniqMap (Var Any) -> Bool
`subsetVarSet` UniqMap (Var Any)
s1
lookupInScope
:: InScopeSet
-> Var a
-> Maybe (Var Any)
lookupInScope :: forall a. InScopeSet -> Var a -> Maybe (Var Any)
lookupInScope (InScopeSet UniqMap (Var Any)
s Unique
_) Var a
v = Var a -> UniqMap (Var Any) -> Maybe (Var Any)
forall a. Var a -> UniqMap (Var Any) -> Maybe (Var Any)
lookupVarSet Var a
v UniqMap (Var Any)
s
elemInScopeSet
:: Var a
-> InScopeSet
-> Bool
elemInScopeSet :: forall a. Var a -> InScopeSet -> Bool
elemInScopeSet Var a
v (InScopeSet UniqMap (Var Any)
s Unique
_) = Var a -> UniqMap (Var Any) -> Bool
forall a. Var a -> UniqMap (Var Any) -> Bool
elemVarSet Var a
v UniqMap (Var Any)
s
elemUniqInScopeSet
:: Unique
-> InScopeSet
-> Bool
elemUniqInScopeSet :: Unique -> InScopeSet -> Bool
elemUniqInScopeSet Unique
u (InScopeSet UniqMap (Var Any)
s Unique
_) = Unique -> UniqMap (Var Any) -> Bool
forall a b. Uniquable a => a -> UniqMap b -> Bool
UniqMap.elem Unique
u UniqMap (Var Any)
s
notElemInScopeSet
:: Var a
-> InScopeSet
-> Bool
notElemInScopeSet :: forall a. Var a -> InScopeSet -> Bool
notElemInScopeSet Var a
v (InScopeSet UniqMap (Var Any)
s Unique
_) = Var a -> UniqMap (Var Any) -> Bool
forall a. Var a -> UniqMap (Var Any) -> Bool
notElemVarSet Var a
v UniqMap (Var Any)
s
mkInScopeSet
:: VarSet
-> InScopeSet
mkInScopeSet :: UniqMap (Var Any) -> InScopeSet
mkInScopeSet UniqMap (Var Any)
is = UniqMap (Var Any) -> Unique -> InScopeSet
InScopeSet UniqMap (Var Any)
is Unique
1
emptyInScopeSet
:: InScopeSet
emptyInScopeSet :: InScopeSet
emptyInScopeSet = UniqMap (Var Any) -> InScopeSet
mkInScopeSet UniqMap (Var Any)
emptyVarSet
uniqAway
:: (Uniquable a, ClashPretty a)
=> InScopeSet
-> a
-> a
uniqAway :: forall a. (Uniquable a, ClashPretty a) => InScopeSet -> a -> a
uniqAway (InScopeSet UniqMap (Var Any)
set Unique
n) a
a =
(Unique -> Bool) -> Unique -> a -> a
forall a.
(Uniquable a, ClashPretty a) =>
(Unique -> Bool) -> Unique -> a -> a
uniqAway' (Unique -> UniqMap (Var Any) -> Bool
forall a b. Uniquable a => a -> UniqMap b -> Bool
`UniqMap.elem` UniqMap (Var Any)
set) Unique
n a
a
uniqAway'
:: (Uniquable a, ClashPretty a)
=> (Unique -> Bool)
-> Seed
-> a
-> a
uniqAway' :: forall a.
(Uniquable a, ClashPretty a) =>
(Unique -> Bool) -> Unique -> a -> a
uniqAway' Unique -> Bool
inScopeTest Unique
n a
u =
if Unique -> Bool
inScopeTest (a -> Unique
forall a. Uniquable a => a -> Unique
getUnique a
u) then
Unique -> a
try Unique
1
else
a
u
where
origUniq :: Unique
origUniq = a -> Unique
forall a. Uniquable a => a -> Unique
getUnique a
u
try :: Unique -> a
try Unique
k
| Bool
debugIsOn Bool -> Bool -> Bool
&& Unique
k Unique -> Unique -> Bool
forall a. Ord a => a -> a -> Bool
> Unique
1000
= String -> Doc () -> a
forall ann a. String -> Doc ann -> a
pprPanic String
"uniqAway loop:" Doc ()
msg
| Unique -> Bool
inScopeTest Unique
uniq
= Unique -> a
try (Unique
k Unique -> Unique -> Unique
forall a. Num a => a -> a -> a
+ Unique
1)
| Unique
k Unique -> Unique -> Bool
forall a. Ord a => a -> a -> Bool
> Unique
3
= String -> Doc () -> a -> a
forall ann a. String -> Doc ann -> a -> a
pprTraceDebug String
"uniqAway:" Doc ()
msg (a -> Unique -> a
forall a. Uniquable a => a -> Unique -> a
setUnique a
u Unique
uniq)
| Bool
otherwise
= a -> Unique -> a
forall a. Uniquable a => a -> Unique -> a
setUnique a
u Unique
uniq
where
msg :: Doc ()
msg = Unique -> Doc ()
forall a. Pretty a => a -> Doc ()
fromPretty Unique
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
<+> Unique -> Doc ()
forall a. Pretty a => a -> Doc ()
fromPretty Unique
n
uniq :: Unique
uniq = Unique -> Unique -> Unique
deriveUnique Unique
origUniq (Unique
n Unique -> Unique -> Unique
forall a. Num a => a -> a -> a
* Unique
k)
deriveUnique
:: Unique
-> Seed
-> Unique
deriveUnique :: Unique -> Unique -> Unique
deriveUnique Unique
i Unique
delta = Unique
i Unique -> Unique -> Unique
forall a. Num a => a -> a -> a
+ Unique
delta