Data.IntMap.Internal
WARNING
This module is considered internal.
The Package Versioning Policy does not apply.
The contents of this module may change in any way whatsoever and without any warning between minor versions of this package.
Authors importing this module are expected to track development closely.
Description
This defines the data structures and core (hidden) manipulations on representations.
Since: containers-0.5.9
Map type
A map of integers to values a
.
Instances
Foldable IntMap Source # | Folds in order of increasing key. |
Defined in Data.IntMap.Internal Methods fold :: Monoid m => IntMap m -> m Source # foldMap :: Monoid m => (a -> m) -> IntMap a -> m Source # foldMap' :: Monoid m => (a -> m) -> IntMap a -> m Source # foldr :: (a -> b -> b) -> b -> IntMap a -> b Source # foldr' :: (a -> b -> b) -> b -> IntMap a -> b Source # foldl :: (b -> a -> b) -> b -> IntMap a -> b Source # foldl' :: (b -> a -> b) -> b -> IntMap a -> b Source # foldr1 :: (a -> a -> a) -> IntMap a -> a Source # foldl1 :: (a -> a -> a) -> IntMap a -> a Source # toList :: IntMap a -> [a] Source # null :: IntMap a -> Bool Source # length :: IntMap a -> Int Source # elem :: Eq a => a -> IntMap a -> Bool Source # maximum :: Ord a => IntMap a -> a Source # minimum :: Ord a => IntMap a -> a Source # | |
Eq1 IntMap Source # | Since: containers-0.5.9 |
Ord1 IntMap Source # | Since: containers-0.5.9 |
Defined in Data.IntMap.Internal | |
Read1 IntMap Source # | Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (IntMap a) Source # liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [IntMap a] Source # liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (IntMap a) Source # liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [IntMap a] Source # | |
Show1 IntMap Source # | Since: containers-0.5.9 |
Traversable IntMap Source # | Traverses in order of increasing key. |
Defined in Data.IntMap.Internal | |
Functor IntMap Source # | |
Lift a => Lift (IntMap a :: Type) Source # | Since: containers-0.6.6 |
Data a => Data (IntMap a) Source # | |
Defined in Data.IntMap.Internal Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> IntMap a -> c (IntMap a) Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (IntMap a) Source # toConstr :: IntMap a -> Constr Source # dataTypeOf :: IntMap a -> DataType Source # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (IntMap a)) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (IntMap a)) Source # gmapT :: (forall b. Data b => b -> b) -> IntMap a -> IntMap a Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> IntMap a -> r Source # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> IntMap a -> r Source # gmapQ :: (forall d. Data d => d -> u) -> IntMap a -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> IntMap a -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> IntMap a -> m (IntMap a) Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> IntMap a -> m (IntMap a) Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> IntMap a -> m (IntMap a) Source # | |
Monoid (IntMap a) Source # | |
Semigroup (IntMap a) Source # | Since: containers-0.5.7 |
IsList (IntMap a) Source # | Since: containers-0.5.6.2 |
Read e => Read (IntMap e) Source # | |
Show a => Show (IntMap a) Source # | |
NFData a => NFData (IntMap a) Source # | |
Defined in Data.IntMap.Internal | |
Eq a => Eq (IntMap a) Source # | |
Ord a => Ord (IntMap a) Source # | |
Defined in Data.IntMap.Internal | |
type Item (IntMap a) Source # | |
Defined in Data.IntMap.Internal |
Operators
(!) :: IntMap a -> Key -> a Source #
error
when the element can not be found.
fromList [(5,'a'), (3,'b')] ! 1 Error: element not in the map fromList [(5,'a'), (3,'b')] ! 5 == 'a'
(!?) :: IntMap a -> Key -> Maybe a infixl 9 Source #
Nothing
when the element can not be found.
fromList [(5,'a'), (3,'b')] !? 1 == Nothing fromList [(5,'a'), (3,'b')] !? 5 == Just 'a'
Since: containers-0.5.11
Query
null :: IntMap a -> Bool Source #
Data.IntMap.null (empty) == True Data.IntMap.null (singleton 1 'a') == False
size :: IntMap a -> Int Source #
size empty == 0 size (singleton 1 'a') == 1 size (fromList([(1,'a'), (2,'c'), (3,'b')])) == 3
member :: Key -> IntMap a -> Bool Source #
member 5 (fromList [(5,'a'), (3,'b')]) == True member 1 (fromList [(5,'a'), (3,'b')]) == False
notMember :: Key -> IntMap a -> Bool Source #
notMember 5 (fromList [(5,'a'), (3,'b')]) == False notMember 1 (fromList [(5,'a'), (3,'b')]) == True
lookup :: Key -> IntMap a -> Maybe a Source #
lookup
.
findWithDefault :: a -> Key -> IntMap a -> a Source #
(
returns the value at key findWithDefault
def k map)k
or returns def
when the key is not an
element of the map.
findWithDefault 'x' 1 (fromList [(5,'a'), (3,'b')]) == 'x' findWithDefault 'x' 5 (fromList [(5,'a'), (3,'b')]) == 'a'
lookupLT :: Key -> IntMap a -> Maybe (Key, a) Source #
lookupLT 3 (fromList [(3,'a'), (5,'b')]) == Nothing lookupLT 4 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a')
lookupGT :: Key -> IntMap a -> Maybe (Key, a) Source #
lookupGT 4 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b') lookupGT 5 (fromList [(3,'a'), (5,'b')]) == Nothing
lookupLE :: Key -> IntMap a -> Maybe (Key, a) Source #
lookupLE 2 (fromList [(3,'a'), (5,'b')]) == Nothing lookupLE 4 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a') lookupLE 5 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b')
lookupGE :: Key -> IntMap a -> Maybe (Key, a) Source #
lookupGE 3 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a') lookupGE 4 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b') lookupGE 6 (fromList [(3,'a'), (5,'b')]) == Nothing
disjoint :: IntMap a -> IntMap b -> Bool Source #
intersection
is empty).
disjoint (fromList [(2,'a')]) (fromList [(1,()), (3,())]) == True disjoint (fromList [(2,'a')]) (fromList [(1,'a'), (2,'b')]) == False disjoint (fromList []) (fromList []) == True
disjoint a b == null (intersection a b)
Since: containers-0.6.2.1
Construction
singleton :: Key -> a -> IntMap a Source #
singleton 1 'a' == fromList [(1, 'a')] size (singleton 1 'a') == 1
Insertion
insert :: Key -> a -> IntMap a -> IntMap a Source #
insert
is equivalent to
.insertWith
const
insert 5 'x' (fromList [(5,'a'), (3,'b')]) == fromList [(3, 'b'), (5, 'x')] insert 7 'x' (fromList [(5,'a'), (3,'b')]) == fromList [(3, 'b'), (5, 'a'), (7, 'x')] insert 5 'x' empty == singleton 5 'x'
insertWith :: (a -> a -> a) -> Key -> a -> IntMap a -> IntMap a Source #
will insert the pair (key, value) into insertWith
f key value mpmp
if key does
not exist in the map. If the key does exist, the function will
insert f new_value old_value
.
insertWith (++) 5 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "xxxa")] insertWith (++) 7 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "xxx")] insertWith (++) 5 "xxx" empty == singleton 5 "xxx"
insertWithKey :: (Key -> a -> a -> a) -> Key -> a -> IntMap a -> IntMap a Source #
will insert the pair (key, value) into insertWithKey
f key value mpmp
if key does
not exist in the map. If the key does exist, the function will
insert f key new_value old_value
.
let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value insertWithKey f 5 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "5:xxx|a")] insertWithKey f 7 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "xxx")] insertWithKey f 5 "xxx" empty == singleton 5 "xxx"
insertLookupWithKey :: (Key -> a -> a -> a) -> Key -> a -> IntMap a -> (Maybe a, IntMap a) Source #
)
is a pair where the first element is equal to (insertLookupWithKey
f k x map
)
and the second element equal to (lookup
k map
).insertWithKey
f k x map
let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value insertLookupWithKey f 5 "xxx" (fromList [(5,"a"), (3,"b")]) == (Just "a", fromList [(3, "b"), (5, "5:xxx|a")]) insertLookupWithKey f 7 "xxx" (fromList [(5,"a"), (3,"b")]) == (Nothing, fromList [(3, "b"), (5, "a"), (7, "xxx")]) insertLookupWithKey f 5 "xxx" empty == (Nothing, singleton 5 "xxx")
This is how to define insertLookup
using insertLookupWithKey
:
let insertLookup kx x t = insertLookupWithKey (\_ a _ -> a) kx x t insertLookup 5 "x" (fromList [(5,"a"), (3,"b")]) == (Just "a", fromList [(3, "b"), (5, "x")]) insertLookup 7 "x" (fromList [(5,"a"), (3,"b")]) == (Nothing, fromList [(3, "b"), (5, "a"), (7, "x")])
Delete/Update
delete :: Key -> IntMap a -> IntMap a Source #
delete 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" delete 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] delete 5 empty == empty
adjust :: (a -> a) -> Key -> IntMap a -> IntMap a Source #
adjust ("new " ++) 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "new a")] adjust ("new " ++) 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] adjust ("new " ++) 7 empty == empty
adjustWithKey :: (Key -> a -> a) -> Key -> IntMap a -> IntMap a Source #
let f key x = (show key) ++ ":new " ++ x adjustWithKey f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "5:new a")] adjustWithKey f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] adjustWithKey f 7 empty == empty
update :: (a -> Maybe a) -> Key -> IntMap a -> IntMap a Source #
) updates the value update
f k mapx
at k
(if it is in the map). If (f x
) is Nothing
, the element is
deleted. If it is (
), the key Just
yk
is bound to the new value y
.
let f x = if x == "a" then Just "new a" else Nothing update f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "new a")] update f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] update f 3 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"
updateWithKey :: (Key -> a -> Maybe a) -> Key -> IntMap a -> IntMap a Source #
) updates the value update
f k mapx
at k
(if it is in the map). If (f k x
) is Nothing
, the element is
deleted. If it is (
), the key Just
yk
is bound to the new value y
.
let f k x = if x == "a" then Just ((show k) ++ ":new a") else Nothing updateWithKey f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "5:new a")] updateWithKey f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] updateWithKey f 3 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"
updateLookupWithKey :: (Key -> a -> Maybe a) -> Key -> IntMap a -> (Maybe a, IntMap a) Source #
updateLookupWithKey
.
Returns the original key value if the map entry is deleted.
let f k x = if x == "a" then Just ((show k) ++ ":new a") else Nothing updateLookupWithKey f 5 (fromList [(5,"a"), (3,"b")]) == (Just "a", fromList [(3, "b"), (5, "5:new a")]) updateLookupWithKey f 7 (fromList [(5,"a"), (3,"b")]) == (Nothing, fromList [(3, "b"), (5, "a")]) updateLookupWithKey f 3 (fromList [(5,"a"), (3,"b")]) == (Just "b", singleton 5 "a")
alterF :: Functor f => (Maybe a -> f (Maybe a)) -> Key -> IntMap a -> f (IntMap a) Source #
) alters the value alterF
f k mapx
at
k
, or absence thereof. alterF
can be used to inspect, insert, delete,
or update a value in an IntMap
. In short :
.lookup
k $ alterF
f k m = f
(lookup
k m)
Example:
interactiveAlter :: Int -> IntMap String -> IO (IntMap String) interactiveAlter k m = alterF f k m where f Nothing = do putStrLn $ show k ++ " was not found in the map. Would you like to add it?" getUserResponse1 :: IO (Maybe String) f (Just old) = do putStrLn $ "The key is currently bound to " ++ show old ++ ". Would you like to change or delete it?" getUserResponse2 :: IO (Maybe String)
alterF
is the most general operation for working with an individual
key that may or may not be in a given map.
Note: alterF
is a flipped version of the at
combinator from
Control.Lens.At
.
Since: containers-0.5.8
Combine
Union
unionWith :: (a -> a -> a) -> IntMap a -> IntMap a -> IntMap a Source #
unionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "aA"), (7, "C")]
unionWithKey :: (Key -> a -> a -> a) -> IntMap a -> IntMap a -> IntMap a Source #
let f key left_value right_value = (show key) ++ ":" ++ left_value ++ "|" ++ right_value unionWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "5:a|A"), (7, "C")]
unions :: Foldable f => f (IntMap a) -> IntMap a Source #
The union of a list of maps.
unions [(fromList [(5, "a"), (3, "b")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "A3"), (3, "B3")])] == fromList [(3, "b"), (5, "a"), (7, "C")] unions [(fromList [(5, "A3"), (3, "B3")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "a"), (3, "b")])] == fromList [(3, "B3"), (5, "A3"), (7, "C")]
unionsWith :: Foldable f => (a -> a -> a) -> f (IntMap a) -> IntMap a Source #
The union of a list of maps, with a combining operation.
unionsWith (++) [(fromList [(5, "a"), (3, "b")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "A3"), (3, "B3")])] == fromList [(3, "bB3"), (5, "aAA3"), (7, "C")]
Difference
difference :: IntMap a -> IntMap b -> IntMap a Source #
difference (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 3 "b"
differenceWith :: (a -> b -> Maybe a) -> IntMap a -> IntMap b -> IntMap a Source #
let f al ar = if al == "b" then Just (al ++ ":" ++ ar) else Nothing differenceWith f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (3, "B"), (7, "C")]) == singleton 3 "b:B"
differenceWithKey :: (Key -> a -> b -> Maybe a) -> IntMap a -> IntMap b -> IntMap a Source #
Nothing
, the element is discarded (proper set difference).
If it returns (
), the element is updated with a new value Just
yy
.
let f k al ar = if al == "b" then Just ((show k) ++ ":" ++ al ++ "|" ++ ar) else Nothing differenceWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (3, "B"), (10, "C")]) == singleton 3 "3:b|B"
Intersection
intersection :: IntMap a -> IntMap b -> IntMap a Source #
intersection (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "a"
intersectionWith :: (a -> b -> c) -> IntMap a -> IntMap b -> IntMap c Source #
intersectionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "aA"
intersectionWithKey :: (Key -> a -> b -> c) -> IntMap a -> IntMap b -> IntMap c Source #
let f k al ar = (show k) ++ ":" ++ al ++ "|" ++ ar intersectionWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "5:a|A"
Compose
compose :: IntMap c -> IntMap Int -> IntMap c Source #
Relate the keys of one map to the values of the other, by using the values of the former as keys for lookups in the latter.
Complexity:
compose (fromList [('a', "A"), ('b', "B")]) (fromList [(1,'a'),(2,'b'),(3,'z')]) = fromList [(1,"A"),(2,"B")]
(compose
bc ab!?
) = (bc!?
) <=< (ab!?
)
Note: Prior to v0.6.4, Data.IntMap.Strict exposed a version of
compose
that forced the values of the output IntMap
. This version does
not force these values.
Since: containers-0.6.3.1
General combining function
type SimpleWhenMissing = WhenMissing Identity Source #
A tactic for dealing with keys present in one map but not the
other in merge
.
A tactic of type SimpleWhenMissing x z
is an abstract
representation of a function of type Key -> x -> Maybe z
.
Since: containers-0.5.9
type SimpleWhenMatched = WhenMatched Identity Source #
A tactic for dealing with keys present in both maps in merge
.
A tactic of type SimpleWhenMatched x y z
is an abstract
representation of a function of type Key -> x -> y -> Maybe z
.
Since: containers-0.5.9
runWhenMatched :: WhenMatched f x y z -> Key -> x -> y -> f (Maybe z) Source #
Along with zipWithMaybeAMatched, witnesses the isomorphism
between WhenMatched f x y z
and Key -> x -> y -> f (Maybe z)
.
Since: containers-0.5.9
runWhenMissing :: WhenMissing f x y -> Key -> x -> f (Maybe y) Source #
Along with traverseMaybeMissing, witnesses the isomorphism
between WhenMissing f x y
and Key -> x -> f (Maybe y)
.
Since: containers-0.5.9
Arguments
:: SimpleWhenMissing a c | What to do with keys in |
-> SimpleWhenMissing b c | What to do with keys in |
-> SimpleWhenMatched a b c | What to do with keys in both |
-> IntMap a | Map |
-> IntMap b | Map |
-> IntMap c |
Merge two maps.
merge
takes two WhenMissing
tactics, a WhenMatched
tactic
and two maps. It uses the tactics to merge the maps. Its behavior
is best understood via its fundamental tactics, mapMaybeMissing
and zipWithMaybeMatched
.
Consider
merge (mapMaybeMissing g1) (mapMaybeMissing g2) (zipWithMaybeMatched f) m1 m2
Take, for example,
m1 = [(0, 'a'), (1, 'b'), (3, 'c'), (4, 'd')] m2 = [(1, "one"), (2, "two"), (4, "three")]
merge
will first "align" these maps by key:
m1 = [(0, 'a'), (1, 'b'), (3, 'c'), (4, 'd')] m2 = [(1, "one"), (2, "two"), (4, "three")]
It will then pass the individual entries and pairs of entries
to g1
, g2
, or f
as appropriate:
maybes = [g1 0 'a', f 1 'b' "one", g2 2 "two", g1 3 'c', f 4 'd' "three"]
This produces a Maybe
for each key:
keys = 0 1 2 3 4 results = [Nothing, Just True, Just False, Nothing, Just True]
Finally, the Just
results are collected into a map:
return value = [(1, True), (2, False), (4, True)]
The other tactics below are optimizations or simplifications of
mapMaybeMissing
for special cases. Most importantly,
dropMissing
drops all the keys.preserveMissing
leaves all the entries alone.
When merge
is given three arguments, it is inlined at the call
site. To prevent excessive inlining, you should typically use
merge
to define your custom combining functions.
Examples:
unionWithKey f = merge preserveMissing preserveMissing (zipWithMatched f)
intersectionWithKey f = merge dropMissing dropMissing (zipWithMatched f)
differenceWith f = merge diffPreserve diffDrop f
symmetricDifference = merge diffPreserve diffPreserve (\ _ _ _ -> Nothing)
mapEachPiece f g h = merge (diffMapWithKey f) (diffMapWithKey g)
Since: containers-0.5.9
WhenMatched
tactics
zipWithMaybeMatched :: Applicative f => (Key -> x -> y -> Maybe z) -> WhenMatched f x y z Source #
When a key is found in both maps, apply a function to the key and values and maybe use the result in the merged map.
zipWithMaybeMatched :: (Key -> x -> y -> Maybe z) -> SimpleWhenMatched x y z
Since: containers-0.5.9
zipWithMatched :: Applicative f => (Key -> x -> y -> z) -> WhenMatched f x y z Source #
When a key is found in both maps, apply a function to the key and values and use the result in the merged map.
zipWithMatched :: (Key -> x -> y -> z) -> SimpleWhenMatched x y z
Since: containers-0.5.9
WhenMissing
tactics
mapMaybeMissing :: Applicative f => (Key -> x -> Maybe y) -> WhenMissing f x y Source #
Map over the entries whose keys are missing from the other
map, optionally removing some. This is the most powerful
SimpleWhenMissing
tactic, but others are usually more efficient.
mapMaybeMissing :: (Key -> x -> Maybe y) -> SimpleWhenMissing x y
mapMaybeMissing f = traverseMaybeMissing (\k x -> pure (f k x))
but mapMaybeMissing
uses fewer unnecessary Applicative
operations.
Since: containers-0.5.9
dropMissing :: Applicative f => WhenMissing f x y Source #
Drop all the entries whose keys are missing from the other map.
dropMissing :: SimpleWhenMissing x y
dropMissing = mapMaybeMissing (\_ _ -> Nothing)
but dropMissing
is much faster.
Since: containers-0.5.9
preserveMissing :: Applicative f => WhenMissing f x x Source #
Preserve, unchanged, the entries whose keys are missing from the other map.
preserveMissing :: SimpleWhenMissing x x
preserveMissing = Merge.Lazy.mapMaybeMissing (\_ x -> Just x)
but preserveMissing
is much faster.
Since: containers-0.5.9
mapMissing :: Applicative f => (Key -> x -> y) -> WhenMissing f x y Source #
Map over the entries whose keys are missing from the other map.
mapMissing :: (k -> x -> y) -> SimpleWhenMissing x y
mapMissing f = mapMaybeMissing (\k x -> Just $ f k x)
but mapMissing
is somewhat faster.
Since: containers-0.5.9
filterMissing :: Applicative f => (Key -> x -> Bool) -> WhenMissing f x x Source #
Filter the entries whose keys are missing from the other map.
filterMissing :: (k -> x -> Bool) -> SimpleWhenMissing x x
filterMissing f = Merge.Lazy.mapMaybeMissing $ \k x -> guard (f k x) *> Just x
but this should be a little faster.
Since: containers-0.5.9
Applicative general combining function
data WhenMissing f x y Source #
A tactic for dealing with keys present in one map but not the
other in merge
or mergeA
.
A tactic of type WhenMissing f k x z
is an abstract representation
of a function of type Key -> x -> f (Maybe z)
.
Since: containers-0.5.9
Constructors
WhenMissing | |
Fields
|
Instances
(Applicative f, Monad f) => Category (WhenMissing f :: Type -> Type -> Type) Source # | Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods id :: forall (a :: k). WhenMissing f a a Source # (.) :: forall (b :: k) (c :: k) (a :: k). WhenMissing f b c -> WhenMissing f a b -> WhenMissing f a c Source # | |
(Applicative f, Monad f) => Applicative (WhenMissing f x) Source # | Equivalent to Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods pure :: a -> WhenMissing f x a Source # (<*>) :: WhenMissing f x (a -> b) -> WhenMissing f x a -> WhenMissing f x b Source # liftA2 :: (a -> b -> c) -> WhenMissing f x a -> WhenMissing f x b -> WhenMissing f x c Source # (*>) :: WhenMissing f x a -> WhenMissing f x b -> WhenMissing f x b Source # (<*) :: WhenMissing f x a -> WhenMissing f x b -> WhenMissing f x a Source # | |
(Applicative f, Monad f) => Functor (WhenMissing f x) Source # | Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods fmap :: (a -> b) -> WhenMissing f x a -> WhenMissing f x b Source # (<$) :: a -> WhenMissing f x b -> WhenMissing f x a Source # | |
(Applicative f, Monad f) => Monad (WhenMissing f x) Source # | Equivalent to Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods (>>=) :: WhenMissing f x a -> (a -> WhenMissing f x b) -> WhenMissing f x b Source # (>>) :: WhenMissing f x a -> WhenMissing f x b -> WhenMissing f x b Source # return :: a -> WhenMissing f x a Source # |
newtype WhenMatched f x y z Source #
A tactic for dealing with keys present in both maps in merge
or mergeA
.
A tactic of type WhenMatched f x y z
is an abstract representation
of a function of type Key -> x -> y -> f (Maybe z)
.
Since: containers-0.5.9
Constructors
WhenMatched | |
Fields
|
Instances
(Monad f, Applicative f) => Category (WhenMatched f x :: Type -> Type -> Type) Source # | Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods id :: forall (a :: k). WhenMatched f x a a Source # (.) :: forall (b :: k) (c :: k) (a :: k). WhenMatched f x b c -> WhenMatched f x a b -> WhenMatched f x a c Source # | |
(Monad f, Applicative f) => Applicative (WhenMatched f x y) Source # | Equivalent to Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods pure :: a -> WhenMatched f x y a Source # (<*>) :: WhenMatched f x y (a -> b) -> WhenMatched f x y a -> WhenMatched f x y b Source # liftA2 :: (a -> b -> c) -> WhenMatched f x y a -> WhenMatched f x y b -> WhenMatched f x y c Source # (*>) :: WhenMatched f x y a -> WhenMatched f x y b -> WhenMatched f x y b Source # (<*) :: WhenMatched f x y a -> WhenMatched f x y b -> WhenMatched f x y a Source # | |
Functor f => Functor (WhenMatched f x y) Source # | Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods fmap :: (a -> b) -> WhenMatched f x y a -> WhenMatched f x y b Source # (<$) :: a -> WhenMatched f x y b -> WhenMatched f x y a Source # | |
(Monad f, Applicative f) => Monad (WhenMatched f x y) Source # | Equivalent to Since: containers-0.5.9 |
Defined in Data.IntMap.Internal Methods (>>=) :: WhenMatched f x y a -> (a -> WhenMatched f x y b) -> WhenMatched f x y b Source # (>>) :: WhenMatched f x y a -> WhenMatched f x y b -> WhenMatched f x y b Source # return :: a -> WhenMatched f x y a Source # |
Arguments
:: Applicative f | |
=> WhenMissing f a c | What to do with keys in |
-> WhenMissing f b c | What to do with keys in |
-> WhenMatched f a b c | What to do with keys in both |
-> IntMap a | Map |
-> IntMap b | Map |
-> f (IntMap c) |
An applicative version of merge
.
mergeA
takes two WhenMissing
tactics, a WhenMatched
tactic and two maps. It uses the tactics to merge the maps.
Its behavior is best understood via its fundamental tactics,
traverseMaybeMissing
and zipWithMaybeAMatched
.
Consider
mergeA (traverseMaybeMissing g1) (traverseMaybeMissing g2) (zipWithMaybeAMatched f) m1 m2
Take, for example,
m1 = [(0, 'a'), (1, 'b'), (3,'c'), (4, 'd')] m2 = [(1, "one"), (2, "two"), (4, "three")]
mergeA
will first "align" these maps by key:
m1 = [(0, 'a'), (1, 'b'), (3, 'c'), (4, 'd')] m2 = [(1, "one"), (2, "two"), (4, "three")]
It will then pass the individual entries and pairs of entries
to g1
, g2
, or f
as appropriate:
actions = [g1 0 'a', f 1 'b' "one", g2 2 "two", g1 3 'c', f 4 'd' "three"]
Next, it will perform the actions in the actions
list in order from
left to right.
keys = 0 1 2 3 4 results = [Nothing, Just True, Just False, Nothing, Just True]
Finally, the Just
results are collected into a map:
return value = [(1, True), (2, False), (4, True)]
The other tactics below are optimizations or simplifications of
traverseMaybeMissing
for special cases. Most importantly,
dropMissing
drops all the keys.preserveMissing
leaves all the entries alone.mapMaybeMissing
does not use theApplicative
context.
When mergeA
is given three arguments, it is inlined at the call
site. To prevent excessive inlining, you should generally only use
mergeA
to define custom combining functions.
Since: containers-0.5.9
WhenMatched
tactics
zipWithMaybeAMatched :: (Key -> x -> y -> f (Maybe z)) -> WhenMatched f x y z Source #
When a key is found in both maps, apply a function to the key and values, perform the resulting action, and maybe use the result in the merged map.
This is the fundamental WhenMatched
tactic.
Since: containers-0.5.9
zipWithAMatched :: Applicative f => (Key -> x -> y -> f z) -> WhenMatched f x y z Source #
When a key is found in both maps, apply a function to the key and values to produce an action and use its result in the merged map.
Since: containers-0.5.9
WhenMissing
tactics
traverseMaybeMissing :: Applicative f => (Key -> x -> f (Maybe y)) -> WhenMissing f x y Source #
Traverse over the entries whose keys are missing from the other
map, optionally producing values to put in the result. This is
the most powerful WhenMissing
tactic, but others are usually
more efficient.
Since: containers-0.5.9
traverseMissing :: Applicative f => (Key -> x -> f y) -> WhenMissing f x y Source #
Traverse over the entries whose keys are missing from the other map.
Since: containers-0.5.9
filterAMissing :: Applicative f => (Key -> x -> f Bool) -> WhenMissing f x x Source #
Filter the entries whose keys are missing from the other map
using some Applicative
action.
filterAMissing f = Merge.Lazy.traverseMaybeMissing $ \k x -> (\b -> guard b *> Just x) <$> f k x
but this should be a little faster.
Since: containers-0.5.9
Deprecated general combining function
mergeWithKey :: (Key -> a -> b -> Maybe c) -> (IntMap a -> IntMap c) -> (IntMap b -> IntMap c) -> IntMap a -> IntMap b -> IntMap c Source #
mergeWithKey
, all combining functions can be defined without any loss of
efficiency (with exception of union
, difference
and intersection
,
where sharing of some nodes is lost with mergeWithKey
).
Please make sure you know what is going on when using mergeWithKey
,
otherwise you can be surprised by unexpected code growth or even
corruption of the data structure.
When mergeWithKey
is given three arguments, it is inlined to the call
site. You should therefore use mergeWithKey
only to define your custom
combining functions. For example, you could define unionWithKey
,
differenceWithKey
and intersectionWithKey
as
myUnionWithKey f m1 m2 = mergeWithKey (\k x1 x2 -> Just (f k x1 x2)) id id m1 m2 myDifferenceWithKey f m1 m2 = mergeWithKey f id (const empty) m1 m2 myIntersectionWithKey f m1 m2 = mergeWithKey (\k x1 x2 -> Just (f k x1 x2)) (const empty) (const empty) m1 m2
When calling
, a function combining two
mergeWithKey
combine only1 only2IntMap
s is created, such that
- if a key is present in both maps, it is passed with both corresponding
values to the
combine
function. Depending on the result, the key is either present in the result with specified value, or is left out; - a nonempty subtree present only in the first map is passed to
only1
and the output is added to the result; - a nonempty subtree present only in the second map is passed to
only2
and the output is added to the result.
The only1
and only2
methods must return a map with a subset (possibly empty) of the keys of the given map.
The values can be modified arbitrarily. Most common variants of only1
and
only2
are id
and
, but for example const
empty
or
map
f
could be used for any filterWithKey
ff
.
mergeWithKey' :: (Prefix -> Mask -> IntMap c -> IntMap c -> IntMap c) -> (IntMap a -> IntMap b -> IntMap c) -> (IntMap a -> IntMap c) -> (IntMap b -> IntMap c) -> IntMap a -> IntMap b -> IntMap c Source #
Traversal
Map
map :: (a -> b) -> IntMap a -> IntMap b Source #
map (++ "x") (fromList [(5,"a"), (3,"b")]) == fromList [(3, "bx"), (5, "ax")]
mapWithKey :: (Key -> a -> b) -> IntMap a -> IntMap b Source #
let f key x = (show key) ++ ":" ++ x mapWithKey f (fromList [(5,"a"), (3,"b")]) == fromList [(3, "3:b"), (5, "5:a")]
traverseWithKey :: Applicative t => (Key -> a -> t b) -> IntMap a -> t (IntMap b) Source #
That is, behaves exactly like a regular traverseWithKey
f s == fromList
$ traverse
((k, v) -> (,) k $ f k v) (toList
m)traverse
except that the traversing
function also has access to the key associated with a value.
traverseWithKey (\k v -> if odd k then Just (succ v) else Nothing) (fromList [(1, 'a'), (5, 'e')]) == Just (fromList [(1, 'b'), (5, 'f')]) traverseWithKey (\k v -> if odd k then Just (succ v) else Nothing) (fromList [(2, 'c')]) == Nothing
traverseMaybeWithKey :: Applicative f => (Key -> a -> f (Maybe b)) -> IntMap a -> f (IntMap b) Source #
Just
results.
Since: containers-0.6.4
mapAccum :: (a -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c) Source #
threads an accumulating
argument through the map in ascending order of keys.mapAccum
let f a b = (a ++ b, b ++ "X") mapAccum f "Everything: " (fromList [(5,"a"), (3,"b")]) == ("Everything: ba", fromList [(3, "bX"), (5, "aX")])
mapAccumWithKey :: (a -> Key -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c) Source #
threads an accumulating
argument through the map in ascending order of keys.mapAccumWithKey
let f a k b = (a ++ " " ++ (show k) ++ "-" ++ b, b ++ "X") mapAccumWithKey f "Everything:" (fromList [(5,"a"), (3,"b")]) == ("Everything: 3-b 5-a", fromList [(3, "bX"), (5, "aX")])
mapAccumRWithKey :: (a -> Key -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c) Source #
threads an accumulating
argument through the map in descending order of keys.mapAccumRWithKey
mapKeys :: (Key -> Key) -> IntMap a -> IntMap a Source #
is the map obtained by applying mapKeys
f sf
to each key of s
.
The size of the result may be smaller if f
maps two or more distinct
keys to the same new key. In this case the value at the greatest of the
original keys is retained.
mapKeys (+ 1) (fromList [(5,"a"), (3,"b")]) == fromList [(4, "b"), (6, "a")] mapKeys (\ _ -> 1) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 1 "c" mapKeys (\ _ -> 3) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 3 "c"
mapKeysWith :: (a -> a -> a) -> (Key -> Key) -> IntMap a -> IntMap a Source #
is the map obtained by applying mapKeysWith
c f sf
to each key of s
.
The size of the result may be smaller if f
maps two or more distinct
keys to the same new key. In this case the associated values will be
combined using c
.
mapKeysWith (++) (\ _ -> 1) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 1 "cdab" mapKeysWith (++) (\ _ -> 3) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 3 "cdab"
mapKeysMonotonic :: (Key -> Key) -> IntMap a -> IntMap a Source #
, but works only when mapKeysMonotonic
f s == mapKeys
f sf
is strictly monotonic.
That is, for any values x
and y
, if x
< y
then f x
< f y
.
The precondition is not checked.
Semi-formally, we have:
and [x < y ==> f x < f y | x <- ls, y <- ls] ==> mapKeysMonotonic f s == mapKeys f s where ls = keys s
This means that f
maps distinct original keys to distinct resulting keys.
This function has slightly better performance than mapKeys
.
mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")]) == fromList [(6, "b"), (10, "a")]
Folds
foldrWithKey :: (Key -> a -> b -> b) -> b -> IntMap a -> b Source #
.foldrWithKey
f z == foldr
(uncurry
f) z . toAscList
For example,
keys map = foldrWithKey (\k x ks -> k:ks) [] map
let f k a result = result ++ "(" ++ (show k) ++ ":" ++ a ++ ")" foldrWithKey f "Map: " (fromList [(5,"a"), (3,"b")]) == "Map: (5:a)(3:b)"
foldlWithKey :: (a -> Key -> b -> a) -> a -> IntMap b -> a Source #
.foldlWithKey
f z == foldl
(\z' (kx, x) -> f z' kx x) z . toAscList
For example,
keys = reverse . foldlWithKey (\ks k x -> k:ks) []
let f result k a = result ++ "(" ++ (show k) ++ ":" ++ a ++ ")" foldlWithKey f "Map: " (fromList [(5,"a"), (3,"b")]) == "Map: (3:b)(5:a)"
foldMapWithKey :: Monoid m => (Key -> a -> m) -> IntMap a -> m Source #
foldMapWithKey
f =fold
.mapWithKey
f
This can be an asymptotically faster than foldrWithKey
or foldlWithKey
for some monoids.
Since: containers-0.5.4
Strict folds
foldr' :: (a -> b -> b) -> b -> IntMap a -> b Source #
foldr
. Each application of the operator is
evaluated before using the result in the next application. This
function is strict in the starting value.
foldl' :: (a -> b -> a) -> a -> IntMap b -> a Source #
foldl
. Each application of the operator is
evaluated before using the result in the next application. This
function is strict in the starting value.
foldrWithKey' :: (Key -> a -> b -> b) -> b -> IntMap a -> b Source #
foldrWithKey
. Each application of the operator is
evaluated before using the result in the next application. This
function is strict in the starting value.
foldlWithKey' :: (a -> Key -> b -> a) -> a -> IntMap b -> a Source #
foldlWithKey
. Each application of the operator is
evaluated before using the result in the next application. This
function is strict in the starting value.
Conversion
elems :: IntMap a -> [a] Source #
elems (fromList [(5,"a"), (3,"b")]) == ["b","a"] elems empty == []
keys :: IntMap a -> [Key] Source #
keys (fromList [(5,"a"), (3,"b")]) == [3,5] keys empty == []
assocs :: IntMap a -> [(Key, a)] Source #
toAscList
. Returns all key/value pairs in the
map in ascending key order. Subject to list fusion.
assocs (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] assocs empty == []
keysSet :: IntMap a -> IntSet Source #
keysSet (fromList [(5,"a"), (3,"b")]) == Data.IntSet.fromList [3,5] keysSet empty == Data.IntSet.empty
fromSet :: (Key -> a) -> IntSet -> IntMap a Source #
fromSet (\k -> replicate k 'a') (Data.IntSet.fromList [3, 5]) == fromList [(5,"aaaaa"), (3,"aaa")] fromSet undefined Data.IntSet.empty == empty
Lists
toList :: IntMap a -> [(Key, a)] Source #
toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] toList empty == []
fromList :: [(Key, a)] -> IntMap a Source #
fromList [] == empty fromList [(5,"a"), (3,"b"), (5, "c")] == fromList [(5,"c"), (3,"b")] fromList [(5,"c"), (3,"b"), (5, "a")] == fromList [(5,"a"), (3,"b")]
fromListWith :: (a -> a -> a) -> [(Key, a)] -> IntMap a Source #
fromAscListWith
.
fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"c")] == fromList [(3, "ab"), (5, "cba")] fromListWith (++) [] == empty
fromListWithKey :: (Key -> a -> a -> a) -> [(Key, a)] -> IntMap a Source #
let f key new_value old_value = show key ++ ":" ++ new_value ++ "|" ++ old_value fromListWithKey f [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"c")] == fromList [(3, "3:a|b"), (5, "5:c|5:b|a")] fromListWithKey f [] == empty
Ordered lists
toAscList :: IntMap a -> [(Key, a)] Source #
toAscList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")]
toDescList :: IntMap a -> [(Key, a)] Source #
toDescList (fromList [(5,"a"), (3,"b")]) == [(5,"a"), (3,"b")]
fromAscList :: [(Key, a)] -> IntMap a Source #
fromAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")]
fromAscListWith :: (a -> a -> a) -> [(Key, a)] -> IntMap a Source #
fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")]
fromAscListWithKey :: (Key -> a -> a -> a) -> [(Key, a)] -> IntMap a Source #
let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "5:b|a")]
fromDistinctAscList :: [(Key, a)] -> IntMap a Source #
fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")]
Filter
filter :: (a -> Bool) -> IntMap a -> IntMap a Source #
filter (> "a") (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" filter (> "x") (fromList [(5,"a"), (3,"b")]) == empty filter (< "a") (fromList [(5,"a"), (3,"b")]) == empty
filterWithKey :: (Key -> a -> Bool) -> IntMap a -> IntMap a Source #
filterWithKey (\k _ -> k > 4) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"
restrictKeys :: IntMap a -> IntSet -> IntMap a Source #
m `restrictKeys` s =filterWithKey
(\k _ -> k`member`
s) m
Since: containers-0.5.8
withoutKeys :: IntMap a -> IntSet -> IntMap a Source #
m `withoutKeys` s =filterWithKey
(\k _ -> k`notMember`
s) m
Since: containers-0.5.8
partition :: (a -> Bool) -> IntMap a -> (IntMap a, IntMap a) Source #
split
.
partition (> "a") (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", singleton 5 "a") partition (< "x") (fromList [(5,"a"), (3,"b")]) == (fromList [(3, "b"), (5, "a")], empty) partition (> "x") (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3, "b"), (5, "a")])
partitionWithKey :: (Key -> a -> Bool) -> IntMap a -> (IntMap a, IntMap a) Source #
split
.
partitionWithKey (\ k _ -> k > 3) (fromList [(5,"a"), (3,"b")]) == (singleton 5 "a", singleton 3 "b") partitionWithKey (\ k _ -> k < 7) (fromList [(5,"a"), (3,"b")]) == (fromList [(3, "b"), (5, "a")], empty) partitionWithKey (\ k _ -> k > 7) (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3, "b"), (5, "a")])
takeWhileAntitone :: (Key -> Bool) -> IntMap a -> IntMap a Source #
Int
s, j < k ==> p j >= p k
.
See note at spanAntitone
.
takeWhileAntitone p =fromDistinctAscList
.takeWhile
(p . fst) .toList
takeWhileAntitone p =filterWithKey
(\k _ -> p k)
Since: containers-0.6.7
dropWhileAntitone :: (Key -> Bool) -> IntMap a -> IntMap a Source #
Int
s, j < k ==> p j >= p k
.
See note at spanAntitone
.
dropWhileAntitone p =fromDistinctAscList
.dropWhile
(p . fst) .toList
dropWhileAntitone p =filterWithKey
(\k _ -> not (p k))
Since: containers-0.6.7
spanAntitone :: (Key -> Bool) -> IntMap a -> (IntMap a, IntMap a) Source #
Int
s, j < k ==> p j >= p k
.
spanAntitone p xs = (takeWhileAntitone
p xs,dropWhileAntitone
p xs) spanAntitone p xs =partitionWithKey
(\k _ -> p k) xs
Note: if p
is not actually antitone, then spanAntitone
will split the map
at some unspecified point.
Since: containers-0.6.7
mapMaybe :: (a -> Maybe b) -> IntMap a -> IntMap b Source #
Just
results.
let f x = if x == "a" then Just "new a" else Nothing mapMaybe f (fromList [(5,"a"), (3,"b")]) == singleton 5 "new a"
mapMaybeWithKey :: (Key -> a -> Maybe b) -> IntMap a -> IntMap b Source #
Just
results.
let f k _ = if k < 5 then Just ("key : " ++ (show k)) else Nothing mapMaybeWithKey f (fromList [(5,"a"), (3,"b")]) == singleton 3 "key : 3"
mapEither :: (a -> Either b c) -> IntMap a -> (IntMap b, IntMap c) Source #
Left
and Right
results.
let f a = if a < "c" then Left a else Right a mapEither f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")]) == (fromList [(3,"b"), (5,"a")], fromList [(1,"x"), (7,"z")]) mapEither (\ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")]) == (empty, fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
mapEitherWithKey :: (Key -> a -> Either b c) -> IntMap a -> (IntMap b, IntMap c) Source #
Left
and Right
results.
let f k a = if k < 5 then Left (k * 2) else Right (a ++ a) mapEitherWithKey f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")]) == (fromList [(1,2), (3,6)], fromList [(5,"aa"), (7,"zz")]) mapEitherWithKey (\_ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")]) == (empty, fromList [(1,"x"), (3,"b"), (5,"a"), (7,"z")])
split :: Key -> IntMap a -> (IntMap a, IntMap a) Source #
) is a pair split
k map(map1,map2)
where all keys in map1
are lower than k
and all keys in
map2
larger than k
. Any key equal to k
is found in neither map1
nor map2
.
split 2 (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3,"b"), (5,"a")]) split 3 (fromList [(5,"a"), (3,"b")]) == (empty, singleton 5 "a") split 4 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", singleton 5 "a") split 5 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", empty) split 6 (fromList [(5,"a"), (3,"b")]) == (fromList [(3,"b"), (5,"a")], empty)
splitLookup :: Key -> IntMap a -> (IntMap a, Maybe a, IntMap a) Source #
split
but also returns whether the pivot
key was found in the original map.
splitLookup 2 (fromList [(5,"a"), (3,"b")]) == (empty, Nothing, fromList [(3,"b"), (5,"a")]) splitLookup 3 (fromList [(5,"a"), (3,"b")]) == (empty, Just "b", singleton 5 "a") splitLookup 4 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", Nothing, singleton 5 "a") splitLookup 5 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", Just "a", empty) splitLookup 6 (fromList [(5,"a"), (3,"b")]) == (fromList [(3,"b"), (5,"a")], Nothing, empty)
splitRoot :: IntMap a -> [IntMap a] Source #
No guarantee is made as to the sizes of the pieces; an internal, but deterministic process determines this. However, it is guaranteed that the pieces returned will be in ascending order (all elements in the first submap less than all elements in the second, and so on).
Examples:
splitRoot (fromList (zip [1..6::Int] ['a'..])) == [fromList [(1,'a'),(2,'b'),(3,'c')],fromList [(4,'d'),(5,'e'),(6,'f')]]
splitRoot empty == []
Note that the current implementation does not return more than two submaps, but you should not depend on this behaviour because it can change in the future without notice.
Submap
isSubmapOf :: Eq a => IntMap a -> IntMap a -> Bool Source #
).isSubmapOf
= isSubmapOfBy
(==)
isSubmapOfBy :: (a -> b -> Bool) -> IntMap a -> IntMap b -> Bool Source #
) returns isSubmapOfBy
f m1 m2True
if
all keys in m1
are in m2
, and when f
returns True
when
applied to their respective values. For example, the following
expressions are all True
:
isSubmapOfBy (==) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) isSubmapOfBy (<=) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) isSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1),(2,2)])
But the following are all False
:
isSubmapOfBy (==) (fromList [(1,2)]) (fromList [(1,1),(2,2)]) isSubmapOfBy (<) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) isSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1)])
isProperSubmapOf :: Eq a => IntMap a -> IntMap a -> Bool Source #
).isProperSubmapOf
= isProperSubmapOfBy
(==)
isProperSubmapOfBy :: (a -> b -> Bool) -> IntMap a -> IntMap b -> Bool Source #
) returns isProperSubmapOfBy
f m1 m2True
when
keys m1
and keys m2
are not equal,
all keys in m1
are in m2
, and when f
returns True
when
applied to their respective values. For example, the following
expressions are all True
:
isProperSubmapOfBy (==) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) isProperSubmapOfBy (<=) (fromList [(1,1)]) (fromList [(1,1),(2,2)])
But the following are all False
:
isProperSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1),(2,2)]) isProperSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1)]) isProperSubmapOfBy (<) (fromList [(1,1)]) (fromList [(1,1),(2,2)])
Min/Max
lookupMin :: IntMap a -> Maybe (Key, a) Source #
Nothing
if the map is empty.
lookupMax :: IntMap a -> Maybe (Key, a) Source #
Nothing
if the map is empty.
findMin :: IntMap a -> (Key, a) Source #
error
if the map is empty.
Use minViewWithKey
if the map may be empty.
findMax :: IntMap a -> (Key, a) Source #
error
if the map is empty.
Use maxViewWithKey
if the map may be empty.
deleteFindMin :: IntMap a -> ((Key, a), IntMap a) Source #
minViewWithKey
if the map may be empty.
deleteFindMax :: IntMap a -> ((Key, a), IntMap a) Source #
maxViewWithKey
if the map may be empty.
updateMin :: (a -> Maybe a) -> IntMap a -> IntMap a Source #
updateMin (\ a -> Just ("X" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3, "Xb"), (5, "a")] updateMin (\ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"
updateMax :: (a -> Maybe a) -> IntMap a -> IntMap a Source #
updateMax (\ a -> Just ("X" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "Xa")] updateMax (\ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"
updateMinWithKey :: (Key -> a -> Maybe a) -> IntMap a -> IntMap a Source #
updateMinWithKey (\ k a -> Just ((show k) ++ ":" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3,"3:b"), (5,"a")] updateMinWithKey (\ _ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"
updateMaxWithKey :: (Key -> a -> Maybe a) -> IntMap a -> IntMap a Source #
updateMaxWithKey (\ k a -> Just ((show k) ++ ":" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3,"b"), (5,"5:a")] updateMaxWithKey (\ _ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"
minView :: IntMap a -> Maybe (a, IntMap a) Source #
Nothing
if passed an empty map.
maxView :: IntMap a -> Maybe (a, IntMap a) Source #
Nothing
if passed an empty map.
minViewWithKey :: IntMap a -> Maybe ((Key, a), IntMap a) Source #
Nothing
if passed an empty map.
minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a") minViewWithKey empty == Nothing
maxViewWithKey :: IntMap a -> Maybe ((Key, a), IntMap a) Source #
Nothing
if passed an empty map.
maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b") maxViewWithKey empty == Nothing
Debugging
showTree :: Show a => IntMap a -> String Source #
showTreeWith :: Show a => Bool -> Bool -> IntMap a -> String Source #
) shows
the tree that implements the map. If showTreeWith
hang wide maphang
is
True
, a hanging tree is shown otherwise a rotated tree is shown. If
wide
is True
, an extra wide version is shown.
Internal types
Utility
natFromInt :: Key -> Nat Source #
intFromNat :: Nat -> Key Source #
zero :: Key -> Mask -> Bool Source #
Should this key follow the left subtree of a Bin
with switching
bit m
? N.B., the answer is only valid when match i p m
is true.
nomatch :: Key -> Prefix -> Mask -> Bool Source #
Does the key i
differ from the prefix p
before getting to
the switching bit m
?
match :: Key -> Prefix -> Mask -> Bool Source #
Does the key i
match the prefix p
(up to but not including
bit m
)?
mask :: Key -> Mask -> Prefix Source #
The prefix of key i
up to (but not including) the switching
bit m
.
maskW :: Nat -> Nat -> Prefix Source #
The prefix of key i
up to (but not including) the switching
bit m
.
branchMask :: Prefix -> Prefix -> Mask Source #
The first switching bit where the two prefixes disagree.
highestBitMask :: Word -> Word Source #
Return a word where only the highest bit is set.
Used by IntMap.Merge.Lazy and IntMap.Merge.Strict
mapWhenMissing :: (Applicative f, Monad f) => (a -> b) -> WhenMissing f x a -> WhenMissing f x b Source #
Map covariantly over a
.WhenMissing
f x
Since: containers-0.5.9
mapWhenMatched :: Functor f => (a -> b) -> WhenMatched f x y a -> WhenMatched f x y b Source #
Map covariantly over a
.WhenMatched
f x y
Since: containers-0.5.9
lmapWhenMissing :: (b -> a) -> WhenMissing f a x -> WhenMissing f b x Source #
Map contravariantly over a
.WhenMissing
f _ x
Since: containers-0.5.9
contramapFirstWhenMatched :: (b -> a) -> WhenMatched f a y z -> WhenMatched f b y z Source #
Map contravariantly over a
.WhenMatched
f _ y z
Since: containers-0.5.9
contramapSecondWhenMatched :: (b -> a) -> WhenMatched f x a z -> WhenMatched f x b z Source #
Map contravariantly over a
.WhenMatched
f x _ z
Since: containers-0.5.9
mapGentlyWhenMissing :: Functor f => (a -> b) -> WhenMissing f x a -> WhenMissing f x b Source #
Map covariantly over a
, using only a
'Functor f' constraint.WhenMissing
f x
mapGentlyWhenMatched :: Functor f => (a -> b) -> WhenMatched f x y a -> WhenMatched f x y b Source #
Map covariantly over a
, using only a
'Functor f' constraint.WhenMatched
f k x