ghc-9.8.0.20230929: The GHC API
Safe HaskellNone
LanguageHaskell2010

GHC.Types.Unique.FM

Synopsis

Unique-keyed mappings

data UniqFM key ele Source #

A finite map from uniques of one type to elements in another type.

The key is just here to keep us honest. It's always safe to use a single type as key. If two types don't overlap in their uniques it's also safe to index the same map at multiple key types. But this is very much discouraged.

Instances

Instances details
Functor (UniqFM key) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

fmap :: (a -> b) -> UniqFM key a -> UniqFM key b Source #

(<$) :: a -> UniqFM key b -> UniqFM key a Source #

(Data key, Data ele) => Data (UniqFM key ele) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> UniqFM key ele -> c (UniqFM key ele) Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (UniqFM key ele) Source #

toConstr :: UniqFM key ele -> Constr Source #

dataTypeOf :: UniqFM key ele -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (UniqFM key ele)) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (UniqFM key ele)) Source #

gmapT :: (forall b. Data b => b -> b) -> UniqFM key ele -> UniqFM key ele Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> UniqFM key ele -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> UniqFM key ele -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> UniqFM key ele -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> UniqFM key ele -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> UniqFM key ele -> m (UniqFM key ele) Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> UniqFM key ele -> m (UniqFM key ele) Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> UniqFM key ele -> m (UniqFM key ele) Source #

Monoid (UniqFM key a) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

mempty :: UniqFM key a Source #

mappend :: UniqFM key a -> UniqFM key a -> UniqFM key a Source #

mconcat :: [UniqFM key a] -> UniqFM key a Source #

Semigroup (UniqFM key a) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

(<>) :: UniqFM key a -> UniqFM key a -> UniqFM key a Source #

sconcat :: NonEmpty (UniqFM key a) -> UniqFM key a Source #

stimes :: Integral b => b -> UniqFM key a -> UniqFM key a Source #

Outputable a => Outputable (UniqFM key a) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

ppr :: UniqFM key a -> SDoc Source #

Eq ele => Eq (UniqFM key ele) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

(==) :: UniqFM key ele -> UniqFM key ele -> Bool #

(/=) :: UniqFM key ele -> UniqFM key ele -> Bool #

newtype NonDetUniqFM key ele Source #

A wrapper around UniqFM with the sole purpose of informing call sites that the provided Foldable and Traversable instances are nondeterministic. If you use this please provide a justification why it doesn't introduce nondeterminism. See Note [Deterministic UniqFM] in GHC.Types.Unique.DFM to learn about determinism.

Constructors

NonDetUniqFM 

Fields

Instances

Instances details
Foldable (NonDetUniqFM key) Source #

Inherently nondeterministic. If you use this please provide a justification why it doesn't introduce nondeterminism. See Note [Deterministic UniqFM] in GHC.Types.Unique.DFM to learn about determinism.

Instance details

Defined in GHC.Types.Unique.FM

Methods

fold :: Monoid m => NonDetUniqFM key m -> m Source #

foldMap :: Monoid m => (a -> m) -> NonDetUniqFM key a -> m Source #

foldMap' :: Monoid m => (a -> m) -> NonDetUniqFM key a -> m Source #

foldr :: (a -> b -> b) -> b -> NonDetUniqFM key a -> b Source #

foldr' :: (a -> b -> b) -> b -> NonDetUniqFM key a -> b Source #

foldl :: (b -> a -> b) -> b -> NonDetUniqFM key a -> b Source #

foldl' :: (b -> a -> b) -> b -> NonDetUniqFM key a -> b Source #

foldr1 :: (a -> a -> a) -> NonDetUniqFM key a -> a Source #

foldl1 :: (a -> a -> a) -> NonDetUniqFM key a -> a Source #

toList :: NonDetUniqFM key a -> [a] Source #

null :: NonDetUniqFM key a -> Bool Source #

length :: NonDetUniqFM key a -> Int Source #

elem :: Eq a => a -> NonDetUniqFM key a -> Bool Source #

maximum :: Ord a => NonDetUniqFM key a -> a Source #

minimum :: Ord a => NonDetUniqFM key a -> a Source #

sum :: Num a => NonDetUniqFM key a -> a Source #

product :: Num a => NonDetUniqFM key a -> a Source #

Traversable (NonDetUniqFM key) Source #

Inherently nondeterministic. If you use this please provide a justification why it doesn't introduce nondeterminism. See Note [Deterministic UniqFM] in GHC.Types.Unique.DFM to learn about determinism.

Instance details

Defined in GHC.Types.Unique.FM

Methods

traverse :: Applicative f => (a -> f b) -> NonDetUniqFM key a -> f (NonDetUniqFM key b) Source #

sequenceA :: Applicative f => NonDetUniqFM key (f a) -> f (NonDetUniqFM key a) Source #

mapM :: Monad m => (a -> m b) -> NonDetUniqFM key a -> m (NonDetUniqFM key b) Source #

sequence :: Monad m => NonDetUniqFM key (m a) -> m (NonDetUniqFM key a) Source #

Functor (NonDetUniqFM key) Source # 
Instance details

Defined in GHC.Types.Unique.FM

Methods

fmap :: (a -> b) -> NonDetUniqFM key a -> NonDetUniqFM key b Source #

(<$) :: a -> NonDetUniqFM key b -> NonDetUniqFM key a Source #

Manipulating those mappings

emptyUFM :: UniqFM key elt Source #

unitUFM :: Uniquable key => key -> elt -> UniqFM key elt Source #

unitDirectlyUFM :: Unique -> elt -> UniqFM key elt Source #

zipToUFM :: Uniquable key => [key] -> [elt] -> UniqFM key elt Source #

listToUFM :: Uniquable key => [(key, elt)] -> UniqFM key elt Source #

listToUFM_Directly :: [(Unique, elt)] -> UniqFM key elt Source #

listToUFM_C :: Uniquable key => (elt -> elt -> elt) -> [(key, elt)] -> UniqFM key elt Source #

listToIdentityUFM :: Uniquable key => [key] -> UniqFM key key Source #

addToUFM :: Uniquable key => UniqFM key elt -> key -> elt -> UniqFM key elt Source #

addToUFM_C Source #

Arguments

:: Uniquable key 
=> (elt -> elt -> elt)

old -> new -> result

-> UniqFM key elt

old

-> key 
-> elt

new

-> UniqFM key elt

result Arguments of combining function of M.insertWith and addToUFM_C are flipped.

addToUFM_Acc :: Uniquable key => (elt -> elts -> elts) -> (elt -> elts) -> UniqFM key elts -> key -> elt -> UniqFM key elts Source #

addToUFM_L Source #

Arguments

:: Uniquable key 
=> (key -> elt -> elt -> elt)

key,old,new

-> key 
-> elt 
-> UniqFM key elt 
-> (Maybe elt, UniqFM key elt)

old, result

Add an element, returns previous lookup result and new map. If old element doesn't exist, add the passed element directly, otherwise compute the element to add using the passed function.

addListToUFM :: Uniquable key => UniqFM key elt -> [(key, elt)] -> UniqFM key elt Source #

addListToUFM_C :: Uniquable key => (elt -> elt -> elt) -> UniqFM key elt -> [(key, elt)] -> UniqFM key elt Source #

Add elements to the map, combining existing values with inserted ones using the given function.

addToUFM_Directly :: UniqFM key elt -> Unique -> elt -> UniqFM key elt Source #

addListToUFM_Directly :: UniqFM key elt -> [(Unique, elt)] -> UniqFM key elt Source #

adjustUFM :: Uniquable key => (elt -> elt) -> UniqFM key elt -> key -> UniqFM key elt Source #

alterUFM Source #

Arguments

:: Uniquable key 
=> (Maybe elt -> Maybe elt)

How to adjust

-> UniqFM key elt

old

-> key

new

-> UniqFM key elt

result

alterUFM_Directly Source #

Arguments

:: (Maybe elt -> Maybe elt)

How to adjust

-> UniqFM key elt

old

-> Unique

new

-> UniqFM key elt

result

adjustUFM_Directly :: (elt -> elt) -> UniqFM key elt -> Unique -> UniqFM key elt Source #

delFromUFM :: Uniquable key => UniqFM key elt -> key -> UniqFM key elt Source #

delFromUFM_Directly :: UniqFM key elt -> Unique -> UniqFM key elt Source #

delListFromUFM :: Uniquable key => UniqFM key elt -> [key] -> UniqFM key elt Source #

delListFromUFM_Directly :: UniqFM key elt -> [Unique] -> UniqFM key elt Source #

plusUFM :: UniqFM key elt -> UniqFM key elt -> UniqFM key elt Source #

plusUFM_C :: (elt -> elt -> elt) -> UniqFM key elt -> UniqFM key elt -> UniqFM key elt Source #

plusUFM_CD :: (elta -> eltb -> eltc) -> UniqFM key elta -> elta -> UniqFM key eltb -> eltb -> UniqFM key eltc Source #

`plusUFM_CD f m1 d1 m2 d2` merges the maps using f as the combinding function and d1 resp. d2 as the default value if there is no entry in m1 reps. m2. The domain is the union of the domains of m1 and m2.

IMPORTANT NOTE: This function strictly applies the modification function and forces the result unlike most the other functions in this module.

Representative example:

plusUFM_CD f {A: 1, B: 2} 23 {B: 3, C: 4} 42
   == {A: f 1 42, B: f 2 3, C: f 23 4 }

plusUFM_CD2 :: (Maybe elta -> Maybe eltb -> eltc) -> UniqFM key elta -> UniqFM key eltb -> UniqFM key eltc Source #

`plusUFM_CD2 f m1 m2` merges the maps using f as the combining function. Unlike plusUFM_CD, a missing value is not defaulted: it is instead passed as Nothing to f. f can never have both its arguments be Nothing.

IMPORTANT NOTE: This function strictly applies the modification function and forces the result.

`plusUFM_CD2 f m1 m2` is the same as `plusUFM_CD f (mapUFM Just m1) Nothing (mapUFM Just m2) Nothing`.

mergeUFM :: (elta -> eltb -> Maybe eltc) -> (UniqFM key elta -> UniqFM key eltc) -> (UniqFM key eltb -> UniqFM key eltc) -> UniqFM key elta -> UniqFM key eltb -> UniqFM key eltc Source #

plusMaybeUFM_C :: (elt -> elt -> Maybe elt) -> UniqFM key elt -> UniqFM key elt -> UniqFM key elt Source #

plusUFMList :: [UniqFM key elt] -> UniqFM key elt Source #

plusUFMListWith :: (elt -> elt -> elt) -> [UniqFM key elt] -> UniqFM key elt Source #

sequenceUFMList :: [UniqFM key elt] -> UniqFM key [elt] Source #

minusUFM :: UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt1 Source #

minusUFM_C :: (elt1 -> elt2 -> Maybe elt1) -> UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt1 Source #

minusUFC_C f map1 map2 returns map1, except that every mapping key |-> value1 in map1 that shares a key with a mapping key |-> value2 in map2 is altered by f: value1 is replaced by f value1 value2, where Just means that the new value is used and Nothing means that the mapping is deleted.

intersectUFM :: UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt1 Source #

intersectUFM_C :: (elt1 -> elt2 -> elt3) -> UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt3 Source #

disjointUFM :: UniqFM key elt1 -> UniqFM key elt2 -> Bool Source #

equalKeysUFM :: UniqFM key a -> UniqFM key b -> Bool Source #

nonDetStrictFoldUFM :: (elt -> a -> a) -> a -> UniqFM key elt -> a Source #

nonDetFoldUFM :: (elt -> a -> a) -> a -> UniqFM key elt -> a Source #

Fold over a UniqFM.

Non-deterministic, unless the folding function is commutative (i.e. a1 f ( a2 f b ) == a2 f ( a1 f b ) for all a1, a2, b).

nonDetStrictFoldUFM_DirectlyM :: Monad m => (Unique -> b -> elt -> m b) -> b -> UniqFM key elt -> m b Source #

In essence foldM See Note [Deterministic UniqFM] to learn about nondeterminism. If you use this please provide a justification why it doesn't introduce nondeterminism.

nonDetFoldWithKeyUFM :: (Unique -> elt -> a -> a) -> a -> UniqFM key elt -> a Source #

Like nonDetFoldUFM, but with the Unique key as well.

nonDetStrictFoldUFM_Directly :: (Unique -> elt -> a -> a) -> a -> UniqFM key elt -> a Source #

anyUFM :: (elt -> Bool) -> UniqFM key elt -> Bool Source #

allUFM :: (elt -> Bool) -> UniqFM key elt -> Bool Source #

seqEltsUFM :: (elt -> ()) -> UniqFM key elt -> () Source #

mapUFM :: (elt1 -> elt2) -> UniqFM key elt1 -> UniqFM key elt2 Source #

mapUFM_Directly :: (Unique -> elt1 -> elt2) -> UniqFM key elt1 -> UniqFM key elt2 Source #

strictMapUFM :: (a -> b) -> UniqFM k a -> UniqFM k b Source #

mapMaybeUFM :: (elt1 -> Maybe elt2) -> UniqFM key elt1 -> UniqFM key elt2 Source #

mapMaybeWithKeyUFM :: (Unique -> elt1 -> Maybe elt2) -> UniqFM key elt1 -> UniqFM key elt2 Source #

elemUFM :: Uniquable key => key -> UniqFM key elt -> Bool Source #

filterUFM :: (elt -> Bool) -> UniqFM key elt -> UniqFM key elt Source #

filterUFM_Directly :: (Unique -> elt -> Bool) -> UniqFM key elt -> UniqFM key elt Source #

partitionUFM :: (elt -> Bool) -> UniqFM key elt -> (UniqFM key elt, UniqFM key elt) Source #

sizeUFM :: UniqFM key elt -> Int Source #

isNullUFM :: UniqFM key elt -> Bool Source #

lookupUFM :: Uniquable key => UniqFM key elt -> key -> Maybe elt Source #

lookupWithDefaultUFM :: Uniquable key => UniqFM key elt -> elt -> key -> elt Source #

lookupWithDefaultUFM_Directly :: UniqFM key elt -> elt -> Unique -> elt Source #

nonDetEltsUFM :: UniqFM key elt -> [elt] Source #

nonDetUFMToList :: UniqFM key elt -> [(Unique, elt)] Source #

ufmToIntMap :: UniqFM key elt -> IntMap elt Source #

unsafeCastUFMKey :: UniqFM key1 elt -> UniqFM key2 elt Source #

Cast the key domain of a UniqFM.

As long as the domains don't overlap in their uniques this is safe.

pprUniqFM :: (a -> SDoc) -> UniqFM key a -> SDoc Source #

pprUFM Source #

Arguments

:: UniqFM key a

The things to be pretty printed

-> ([a] -> SDoc)

The pretty printing function to use on the elements

-> SDoc

SDoc where the things have been pretty printed

Pretty-print a non-deterministic set. The order of variables is non-deterministic and for pretty-printing that shouldn't be a problem. Having this function helps contain the non-determinism created with nonDetEltsUFM.

pprUFMWithKeys Source #

Arguments

:: UniqFM key a

The things to be pretty printed

-> ([(Unique, a)] -> SDoc)

The pretty printing function to use on the elements

-> SDoc

SDoc where the things have been pretty printed

Pretty-print a non-deterministic set. The order of variables is non-deterministic and for pretty-printing that shouldn't be a problem. Having this function helps contain the non-determinism created with nonDetUFMToList.

pluralUFM :: UniqFM key a -> SDoc Source #

Determines the pluralisation suffix appropriate for the length of a set in the same way that plural from Outputable does for lists.