bimap-0.2: Bidirectional mapping between two key types

Data.Bimap

Contents

Description

An implementation of bidirectional maps between values of two key types. A Bimap is essentially a bijection between subsets of its two argument types.

Most functions implicitly consider the left-hand type to be the key, and the right-hand type to be the value. Functions with an R suffix reverse this convention, treating the left-hand type as the key.

Synopsis

Bimap type

data Bimap a b Source

A bidirectional map between values of types a and b.

Instances

(Eq a, Eq b) => Eq (Bimap a b) 
(Show a, Show b) => Show (Bimap a b) 

Query

null :: Bimap a b -> BoolSource

Is the bimap empty?

size :: Bimap a b -> IntSource

The number of elements in the bimap.

member :: (Ord a, Ord b) => a -> Bimap a b -> BoolSource

Is the specified value a member of the bimap?

memberR :: (Ord a, Ord b) => b -> Bimap a b -> BoolSource

A version of member specialized to the right key.

notMember :: (Ord a, Ord b) => a -> Bimap a b -> BoolSource

Is the specified value not a member of the bimap?

notMemberR :: (Ord a, Ord b) => b -> Bimap a b -> BoolSource

A version of notMember specialized to the right key.

pairMember :: (Ord a, Ord b) => (a, b) -> Bimap a b -> BoolSource

Are the two values associated with each other in the bimap?

This function is uncurried in its first two arguments, so that it can be used infix.

pairNotMember :: (Ord a, Ord b) => (a, b) -> Bimap a b -> BoolSource

Are the two values not in the bimap, or not associated with each other? (Complement of pairMember.)

lookup :: (Ord a, Ord b, Monad m) => a -> Bimap a b -> m bSource

Lookup a left key in the bimap, returning the associated right key.

This function will return the result in the monad, or fail if the value isn't in the bimap.

lookupR :: (Ord a, Ord b, Monad m) => b -> Bimap a b -> m aSource

A version of lookup that is specialized to the right key, and returns only the left key.

(!) :: (Ord a, Ord b) => Bimap a b -> a -> bSource

Find the right key corresponding to a given left key. Calls error when the key is not in the bimap.

(!>) :: (Ord a, Ord b) => Bimap a b -> b -> aSource

A version of (!) that is specialized to the right key, and returns only the left key.

Construction

empty :: Bimap a bSource

The empty bimap.

singleton :: a -> b -> Bimap a bSource

A bimap with a single element.

Update

insert :: (Ord a, Ord b) => a -> b -> Bimap a b -> Bimap a bSource

Insert a pair of values into the bimap, associating them. If either of the values is already in the bimap, any overlapping bindings are deleted.

delete :: (Ord a, Ord b) => a -> Bimap a b -> Bimap a bSource

Delete a value and its twin from a bimap. When the value is not a member of the bimap, the original bimap is returned.

deleteR :: (Ord a, Ord b) => b -> Bimap a b -> Bimap a bSource

A version of delete specialized to the right key.

Conversion/traversal

fromList :: (Ord a, Ord b) => [(a, b)] -> Bimap a bSource

Build a map from a list of pairs. If there are any overlapping pairs in the list, the later ones will override the earlier ones.

toList :: Bimap a b -> [(a, b)]Source

Convert to a list of associated pairs.

toAscList :: Bimap a b -> [(a, b)]Source

Convert to a list of associated pairs, with the left-hand values in ascending order. Since pair ordering is lexical, the pairs will also be in ascending order.

toAscListR :: Bimap a b -> [(b, a)]Source

Convert to a list of associated pairs, with the right-hand values first in the pair and in ascending order. Since pair ordering is lexical, the pairs will also be in ascending order.

keys :: Bimap a b -> [a]Source

Return all left-hand keys in the bimap in ascending order.

keysR :: Bimap a b -> [b]Source

Return all right-hand keys in the bimap in ascending order.

elems :: Bimap a b -> [b]Source

An alias for keysR.

assocs :: Bimap a b -> [(a, b)]Source

Return all associated pairs in the bimap, with the left-hand values in ascending order.

fold :: (a -> b -> c -> c) -> c -> Bimap a b -> cSource

Fold the association pairs in the map, such that fold f z == foldr f z . assocs.

Miscellaneous

valid :: (Ord a, Ord b) => Bimap a b -> BoolSource

Test if the internal bimap structure is valid.

twist :: Bimap a b -> Bimap b aSource

Reverse the positions of the two element types in the bimap.

twisted :: (Bimap a b -> Bimap a b) -> Bimap b a -> Bimap b aSource

Reverse the positions of the two element types in a bimap transformation.