-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Assorted concrete container types -- -- This package contains efficient general-purpose implementations of -- various basic immutable container types. The declared cost of each -- operation is either worst-case or amortized, but remains valid even if -- structures are shared. @package containers @version 0.5.8.2 -- | An efficient implementation of sets. -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import Data.Set (Set) -- import qualified Data.Set as Set ---- -- The implementation of Set is based on size balanced -- binary trees (or trees of bounded balance) as described by: -- --
-- lookupLT 3 (fromList [3, 5]) == Nothing -- lookupLT 5 (fromList [3, 5]) == Just 3 --lookupLT :: Ord a => a -> Set a -> Maybe a -- | O(log n). Find smallest element greater than the given one. -- --
-- lookupGT 4 (fromList [3, 5]) == Just 5 -- lookupGT 5 (fromList [3, 5]) == Nothing --lookupGT :: Ord a => a -> Set a -> Maybe a -- | O(log n). Find largest element smaller or equal to the given -- one. -- --
-- lookupLE 2 (fromList [3, 5]) == Nothing -- lookupLE 4 (fromList [3, 5]) == Just 3 -- lookupLE 5 (fromList [3, 5]) == Just 5 --lookupLE :: Ord a => a -> Set a -> Maybe a -- | O(log n). Find smallest element greater or equal to the given -- one. -- --
-- lookupGE 3 (fromList [3, 5]) == Just 3 -- lookupGE 4 (fromList [3, 5]) == Just 5 -- lookupGE 6 (fromList [3, 5]) == Nothing --lookupGE :: Ord a => a -> Set a -> Maybe a -- | O(n+m). Is this a subset? (s1 isSubsetOf s2) -- tells whether s1 is a subset of s2. isSubsetOf :: Ord a => Set a -> Set a -> Bool -- | O(n+m). Is this a proper subset? (ie. a subset but not equal). isProperSubsetOf :: Ord a => Set a -> Set a -> Bool -- | O(1). The empty set. empty :: Set a -- | O(1). Create a singleton set. singleton :: a -> Set a -- | O(log n). Insert an element in a set. If the set already -- contains an element equal to the given value, it is replaced with the -- new value. insert :: Ord a => a -> Set a -> Set a -- | O(log n). Delete an element from a set. delete :: Ord a => a -> Set a -> Set a -- | O(m*log(nm + 1)), m <= n/. The union of two sets, preferring -- the first set when equal elements are encountered. union :: Ord a => Set a -> Set a -> Set a -- | The union of a list of sets: (unions == foldl -- union empty). unions :: Ord a => [Set a] -> Set a -- | O(m*log(nm + 1)), m <= n/. Difference of two sets. difference :: Ord a => Set a -> Set a -> Set a -- | O(m*log(nm + 1)), m <= n/. The intersection of two sets. -- Elements of the result come from the first set, so for example -- --
-- import qualified Data.Set as S -- data AB = A | B deriving Show -- instance Ord AB where compare _ _ = EQ -- instance Eq AB where _ == _ = True -- main = print (S.singleton A `S.intersection` S.singleton B, -- S.singleton B `S.intersection` S.singleton A) ---- -- prints (fromList [A],fromList [B]). intersection :: Ord a => Set a -> Set a -> Set a -- | O(n). Filter all elements that satisfy the predicate. filter :: (a -> Bool) -> Set a -> Set a -- | O(log n). Take while a predicate on the elements holds. The -- user is responsible for ensuring that for all elements j and -- k in the set, j < k ==> p j >= p k. See -- note at spanAntitone. -- --
-- takeWhileAntitone p = fromDistinctAscList . takeWhile p . toList -- takeWhileAntitone p = filter p --takeWhileAntitone :: (a -> Bool) -> Set a -> Set a -- | O(log n). Drop while a predicate on the elements holds. The -- user is responsible for ensuring that for all elements j and -- k in the set, j < k ==> p j >= p k. See -- note at spanAntitone. -- --
-- dropWhileAntitone p = fromDistinctAscList . dropWhile p . toList -- dropWhileAntitone p = filter (not . p) --dropWhileAntitone :: (a -> Bool) -> Set a -> Set a -- | O(log n). Divide a set at the point where a predicate on the -- elements stops holding. The user is responsible for ensuring that for -- all elements j and k in the set, j < k ==> -- p j >= p k. -- --
-- spanAntitone p xs = (takeWhileAntitone p xs, dropWhileAntitone p xs) -- spanAntitone p xs = partition p xs ---- -- Note: if p is not actually antitone, then -- spanAntitone will split the set at some unspecified -- point where the predicate switches from holding to not holding (where -- the predicate is seen to hold before the first element and to fail -- after the last element). spanAntitone :: (a -> Bool) -> Set a -> (Set a, Set a) -- | O(n). Partition the set into two sets, one with all elements -- that satisfy the predicate and one with all elements that don't -- satisfy the predicate. See also split. partition :: (a -> Bool) -> Set a -> (Set a, Set a) -- | O(log n). The expression (split x set) is a -- pair (set1,set2) where set1 comprises the elements -- of set less than x and set2 comprises the -- elements of set greater than x. split :: Ord a => a -> Set a -> (Set a, Set a) -- | O(log n). Performs a split but also returns whether the -- pivot element was found in the original set. splitMember :: Ord a => a -> Set a -> (Set a, Bool, Set a) -- | O(1). Decompose a set into pieces based on the structure of the -- underlying tree. This function is useful for consuming a set in -- parallel. -- -- 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 subset less than all elements in the second, and so on). -- -- Examples: -- --
-- splitRoot (fromList [1..6]) == -- [fromList [1,2,3],fromList [4],fromList [5,6]] ---- --
-- splitRoot empty == [] ---- -- Note that the current implementation does not return more than three -- subsets, but you should not depend on this behaviour because it can -- change in the future without notice. splitRoot :: Set a -> [Set a] -- | O(log n). Lookup the index of an element, which is its -- zero-based index in the sorted sequence of elements. The index is a -- number from 0 up to, but not including, the size of the -- set. -- --
-- isJust (lookupIndex 2 (fromList [5,3])) == False -- fromJust (lookupIndex 3 (fromList [5,3])) == 0 -- fromJust (lookupIndex 5 (fromList [5,3])) == 1 -- isJust (lookupIndex 6 (fromList [5,3])) == False --lookupIndex :: Ord a => a -> Set a -> Maybe Int -- | O(log n). Return the index of an element, which is its -- zero-based index in the sorted sequence of elements. The index is a -- number from 0 up to, but not including, the size of the -- set. Calls error when the element is not a member of the -- set. -- --
-- findIndex 2 (fromList [5,3]) Error: element is not in the set -- findIndex 3 (fromList [5,3]) == 0 -- findIndex 5 (fromList [5,3]) == 1 -- findIndex 6 (fromList [5,3]) Error: element is not in the set --findIndex :: Ord a => a -> Set a -> Int -- | O(log n). Retrieve an element by its index, i.e. by its -- zero-based index in the sorted sequence of elements. If the -- index is out of range (less than zero, greater or equal to -- size of the set), error is called. -- --
-- elemAt 0 (fromList [5,3]) == 3 -- elemAt 1 (fromList [5,3]) == 5 -- elemAt 2 (fromList [5,3]) Error: index out of range --elemAt :: Int -> Set a -> a -- | O(log n). Delete the element at index, i.e. by its -- zero-based index in the sorted sequence of elements. If the -- index is out of range (less than zero, greater or equal to -- size of the set), error is called. -- --
-- deleteAt 0 (fromList [5,3]) == singleton 5 -- deleteAt 1 (fromList [5,3]) == singleton 3 -- deleteAt 2 (fromList [5,3]) Error: index out of range -- deleteAt (-1) (fromList [5,3]) Error: index out of range --deleteAt :: Int -> Set a -> Set a -- | Take a given number of elements in order, beginning with the smallest -- ones. -- --
-- take n = fromDistinctAscList . take n . toAscList --take :: Int -> Set a -> Set a -- | Drop a given number of elements in order, beginning with the smallest -- ones. -- --
-- drop n = fromDistinctAscList . drop n . toAscList --drop :: Int -> Set a -> Set a -- | O(log n). Split a set at a particular index. -- --
-- splitAt !n !xs = (take n xs, drop n xs) --splitAt :: Int -> Set a -> (Set a, Set a) -- | O(n*log n). map f s is the set obtained by -- applying f to each element of s. -- -- It's worth noting that the size of the result may be smaller if, for -- some (x,y), x /= y && f x == f y map :: Ord b => (a -> b) -> Set a -> Set b -- | O(n). The -- -- mapMonotonic f s == map f s, but works only -- when f is strictly increasing. The precondition is not -- checked. Semi-formally, we have: -- --
-- and [x < y ==> f x < f y | x <- ls, y <- ls] -- ==> mapMonotonic f s == map f s -- where ls = toList s --mapMonotonic :: (a -> b) -> Set a -> Set b -- | O(n). Fold the elements in the set using the given -- right-associative binary operator, such that foldr f z == -- foldr f z . toAscList. -- -- For example, -- --
-- toAscList set = foldr (:) [] set --foldr :: (a -> b -> b) -> b -> Set a -> b -- | O(n). Fold the elements in the set using the given -- left-associative binary operator, such that foldl f z == -- foldl f z . toAscList. -- -- For example, -- --
-- toDescList set = foldl (flip (:)) [] set --foldl :: (a -> b -> a) -> a -> Set b -> a -- | O(n). A strict version of foldr. Each application of the -- operator is evaluated before using the result in the next application. -- This function is strict in the starting value. foldr' :: (a -> b -> b) -> b -> Set a -> b -- | O(n). A strict version of foldl. 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 -> Set b -> a -- | O(n). Fold the elements in the set using the given -- right-associative binary operator. This function is an equivalent of -- foldr and is present for compatibility only. -- -- Please note that fold will be deprecated in the future and -- removed. fold :: (a -> b -> b) -> b -> Set a -> b -- | O(log n). The minimal element of a set. findMin :: Set a -> a -- | O(log n). The maximal element of a set. findMax :: Set a -> a -- | O(log n). Delete the minimal element. Returns an empty set if -- the set is empty. deleteMin :: Set a -> Set a -- | O(log n). Delete the maximal element. Returns an empty set if -- the set is empty. deleteMax :: Set a -> Set a -- | O(log n). Delete and find the minimal element. -- --
-- deleteFindMin set = (findMin set, deleteMin set) --deleteFindMin :: Set a -> (a, Set a) -- | O(log n). Delete and find the maximal element. -- --
-- deleteFindMax set = (findMax set, deleteMax set) --deleteFindMax :: Set a -> (a, Set a) -- | O(log n). Retrieves the maximal key of the set, and the set -- stripped of that element, or Nothing if passed an empty set. maxView :: Set a -> Maybe (a, Set a) -- | O(log n). Retrieves the minimal key of the set, and the set -- stripped of that element, or Nothing if passed an empty set. minView :: Set a -> Maybe (a, Set a) -- | O(n). An alias of toAscList. The elements of a set in -- ascending order. Subject to list fusion. elems :: Set a -> [a] -- | O(n). Convert the set to a list of elements. Subject to list -- fusion. toList :: Set a -> [a] -- | O(n*log n). Create a set from a list of elements. -- -- If the elements are ordered, a linear-time implementation is used, -- with the performance equal to fromDistinctAscList. fromList :: Ord a => [a] -> Set a -- | O(n). Convert the set to an ascending list of elements. Subject -- to list fusion. toAscList :: Set a -> [a] -- | O(n). Convert the set to a descending list of elements. Subject -- to list fusion. toDescList :: Set a -> [a] -- | O(n). Build a set from an ascending list in linear time. The -- precondition (input list is ascending) is not checked. fromAscList :: Eq a => [a] -> Set a -- | O(n). Build a set from a descending list in linear time. The -- precondition (input list is descending) is not checked. fromDescList :: Eq a => [a] -> Set a -- | O(n). Build a set from an ascending list of distinct elements -- in linear time. The precondition (input list is strictly ascending) -- is not checked. fromDistinctAscList :: [a] -> Set a -- | O(n). Build a set from a descending list of distinct elements -- in linear time. The precondition (input list is strictly -- descending) is not checked. fromDistinctDescList :: [a] -> Set a -- | O(n). Show the tree that implements the set. The tree is shown -- in a compressed, hanging format. showTree :: Show a => Set a -> String -- | O(n). The expression (showTreeWith hang wide map) -- shows the tree that implements the set. If hang is -- True, a hanging tree is shown otherwise a rotated tree -- is shown. If wide is True, an extra wide version is -- shown. -- --
-- Set> putStrLn $ showTreeWith True False $ fromDistinctAscList [1..5] -- 4 -- +--2 -- | +--1 -- | +--3 -- +--5 -- -- Set> putStrLn $ showTreeWith True True $ fromDistinctAscList [1..5] -- 4 -- | -- +--2 -- | | -- | +--1 -- | | -- | +--3 -- | -- +--5 -- -- Set> putStrLn $ showTreeWith False True $ fromDistinctAscList [1..5] -- +--5 -- | -- 4 -- | -- | +--3 -- | | -- +--2 -- | -- +--1 --showTreeWith :: Show a => Bool -> Bool -> Set a -> String -- | O(n). Test if the internal set structure is valid. valid :: Ord a => Set a -> Bool -- | General purpose finite sequences. Apart from being finite and having -- strict operations, sequences also differ from lists in supporting a -- wider variety of operations efficiently. -- -- An amortized running time is given for each operation, with n -- referring to the length of the sequence and i being the -- integral index used by some operations. These bounds hold even in a -- persistent (shared) setting. -- -- The implementation uses 2-3 finger trees annotated with sizes, as -- described in section 4.2 of -- --
-- replicateA n x = sequenceA (replicate n x) --replicateA :: Applicative f => Int -> f a -> f (Seq a) -- | replicateM is a sequence counterpart of replicateM. -- --
-- replicateM n x = sequence (replicate n x) --replicateM :: Monad m => Int -> m a -> m (Seq a) -- | O(log(k)). cycleTaking k xs forms a sequence of -- length k by repeatedly concatenating xs with itself. -- xs may only be empty if k is 0. -- --
-- cycleTaking k = fromList . take k . cycle . toList --cycleTaking :: Int -> Seq a -> Seq a -- | O(n). Constructs a sequence by repeated application of a -- function to a seed value. -- --
-- iterateN n f x = fromList (Prelude.take n (Prelude.iterate f x)) --iterateN :: Int -> (a -> a) -> a -> Seq a -- | Builds a sequence from a seed value. Takes time linear in the number -- of generated elements. WARNING: If the number of generated -- elements is infinite, this method will not terminate. unfoldr :: (b -> Maybe (a, b)) -> b -> Seq a -- | unfoldl f x is equivalent to reverse -- (unfoldr (fmap swap . f) x). unfoldl :: (b -> Maybe (b, a)) -> b -> Seq a -- | O(1). Is this the empty sequence? null :: Seq a -> Bool -- | O(1). The number of elements in the sequence. length :: Seq a -> Int -- | View of the left end of a sequence. data ViewL a -- | empty sequence EmptyL :: ViewL a -- | leftmost element and the rest of the sequence (:<) :: a -> Seq a -> ViewL a -- | O(1). Analyse the left end of a sequence. viewl :: Seq a -> ViewL a -- | View of the right end of a sequence. data ViewR a -- | empty sequence EmptyR :: ViewR a -- | the sequence minus the rightmost element, and the rightmost element (:>) :: Seq a -> a -> ViewR a -- | O(1). Analyse the right end of a sequence. viewr :: Seq a -> ViewR a -- | scanl is similar to foldl, but returns a sequence of -- reduced values from the left: -- --
-- scanl f z (fromList [x1, x2, ...]) = fromList [z, z `f` x1, (z `f` x1) `f` x2, ...] --scanl :: (a -> b -> a) -> a -> Seq b -> Seq a -- | scanl1 is a variant of scanl that has no starting value -- argument: -- --
-- scanl1 f (fromList [x1, x2, ...]) = fromList [x1, x1 `f` x2, ...] --scanl1 :: (a -> a -> a) -> Seq a -> Seq a -- | scanr is the right-to-left dual of scanl. scanr :: (a -> b -> b) -> b -> Seq a -> Seq b -- | scanr1 is a variant of scanr that has no starting value -- argument. scanr1 :: (a -> a -> a) -> Seq a -> Seq a -- | O(n). Returns a sequence of all suffixes of this sequence, -- longest first. For example, -- --
-- tails (fromList "abc") = fromList [fromList "abc", fromList "bc", fromList "c", fromList ""] ---- -- Evaluating the ith suffix takes O(log(min(i, n-i))), but -- evaluating every suffix in the sequence takes O(n) due to -- sharing. tails :: Seq a -> Seq (Seq a) -- | O(n). Returns a sequence of all prefixes of this sequence, -- shortest first. For example, -- --
-- inits (fromList "abc") = fromList [fromList "", fromList "a", fromList "ab", fromList "abc"] ---- -- Evaluating the ith prefix takes O(log(min(i, n-i))), but -- evaluating every prefix in the sequence takes O(n) due to -- sharing. inits :: Seq a -> Seq (Seq a) -- | O(n). chunksOf n xs splits xs into chunks of -- size n>0. If n does not divide the length of -- xs evenly, then the last element of the result will be short. chunksOf :: Int -> Seq a -> Seq (Seq a) -- | O(i) where i is the prefix length. takeWhileL, -- applied to a predicate p and a sequence xs, returns -- the longest prefix (possibly empty) of xs of elements that -- satisfy p. takeWhileL :: (a -> Bool) -> Seq a -> Seq a -- | O(i) where i is the suffix length. takeWhileR, -- applied to a predicate p and a sequence xs, returns -- the longest suffix (possibly empty) of xs of elements that -- satisfy p. -- -- takeWhileR p xs is equivalent to reverse -- (takeWhileL p (reverse xs)). takeWhileR :: (a -> Bool) -> Seq a -> Seq a -- | O(i) where i is the prefix length. dropWhileL -- p xs returns the suffix remaining after takeWhileL p -- xs. dropWhileL :: (a -> Bool) -> Seq a -> Seq a -- | O(i) where i is the suffix length. dropWhileR -- p xs returns the prefix remaining after takeWhileR p -- xs. -- -- dropWhileR p xs is equivalent to reverse -- (dropWhileL p (reverse xs)). dropWhileR :: (a -> Bool) -> Seq a -> Seq a -- | O(i) where i is the prefix length. spanl, applied -- to a predicate p and a sequence xs, returns a pair -- whose first element is the longest prefix (possibly empty) of -- xs of elements that satisfy p and the second element -- is the remainder of the sequence. spanl :: (a -> Bool) -> Seq a -> (Seq a, Seq a) -- | O(i) where i is the suffix length. spanr, applied -- to a predicate p and a sequence xs, returns a pair -- whose first element is the longest suffix (possibly -- empty) of xs of elements that satisfy p and the -- second element is the remainder of the sequence. spanr :: (a -> Bool) -> Seq a -> (Seq a, Seq a) -- | O(i) where i is the breakpoint index. breakl, -- applied to a predicate p and a sequence xs, returns -- a pair whose first element is the longest prefix (possibly empty) of -- xs of elements that do not satisfy p and the -- second element is the remainder of the sequence. -- -- breakl p is equivalent to spanl (not . -- p). breakl :: (a -> Bool) -> Seq a -> (Seq a, Seq a) -- | breakr p is equivalent to spanr (not . -- p). breakr :: (a -> Bool) -> Seq a -> (Seq a, Seq a) -- | O(n). The partition function takes a predicate -- p and a sequence xs and returns sequences of those -- elements which do and do not satisfy the predicate. partition :: (a -> Bool) -> Seq a -> (Seq a, Seq a) -- | O(n). The filter function takes a predicate p -- and a sequence xs and returns a sequence of those elements -- which satisfy the predicate. filter :: (a -> Bool) -> Seq a -> Seq a -- | O(n log n). sort sorts the specified Seq by the -- natural ordering of its elements. The sort is stable. If stability is -- not required, unstableSort can be considerably faster, and in -- particular uses less memory. sort :: Ord a => Seq a -> Seq a -- | O(n log n). sortBy sorts the specified Seq -- according to the specified comparator. The sort is stable. If -- stability is not required, unstableSortBy can be considerably -- faster, and in particular uses less memory. sortBy :: (a -> a -> Ordering) -> Seq a -> Seq a -- | O(n log n). unstableSort sorts the specified Seq -- by the natural ordering of its elements, but the sort is not stable. -- This algorithm is frequently faster and uses less memory than -- sort, and performs extremely well -- frequently twice as fast -- as sort -- when the sequence is already nearly sorted. unstableSort :: Ord a => Seq a -> Seq a -- | O(n log n). A generalization of unstableSort, -- unstableSortBy takes an arbitrary comparator and sorts the -- specified sequence. The sort is not stable. This algorithm is -- frequently faster and uses less memory than sortBy, and -- performs extremely well -- frequently twice as fast as sortBy -- -- when the sequence is already nearly sorted. unstableSortBy :: (a -> a -> Ordering) -> Seq a -> Seq a -- | O(log(min(i,n-i))). The element at the specified position, -- counting from 0. If the specified position is negative or at least the -- length of the sequence, lookup returns Nothing. -- --
-- 0 <= i < length xs ==> lookup i xs == Just (toList xs !! i) ---- --
-- i < 0 || i >= length xs ==> lookup i xs = Nothing ---- -- Unlike index, this can be used to retrieve an element without -- forcing it. For example, to insert the fifth element of a sequence -- xs into a Map m at key k, you could -- use -- --
-- case lookup 5 xs of -- Nothing -> m -- Just x -> insert k x m --lookup :: Int -> Seq a -> Maybe a -- | O(log(min(i,n-i))). A flipped, infix version of lookup. (!?) :: Seq a -> Int -> Maybe a -- | O(log(min(i,n-i))). The element at the specified position, -- counting from 0. The argument should thus be a non-negative integer -- less than the size of the sequence. If the position is out of range, -- index fails with an error. -- --
-- xs `index` i = toList xs !! i ---- -- Caution: index necessarily delays retrieving the requested -- element until the result is forced. It can therefore lead to a space -- leak if the result is stored, unforced, in another structure. To -- retrieve an element immediately without forcing it, use lookup -- or '(!?)'. index :: Seq a -> Int -> a -- | O(log(min(i,n-i))). Update the element at the specified -- position. If the position is out of range, the original sequence is -- returned. adjust can lead to poor performance and even memory -- leaks, because it does not force the new value before installing it in -- the sequence. adjust' should usually be preferred. adjust :: (a -> a) -> Int -> Seq a -> Seq a -- | O(log(min(i,n-i))). Update the element at the specified -- position. If the position is out of range, the original sequence is -- returned. The new value is forced before it is installed in the -- sequence. -- --
-- adjust' f i xs = -- case xs !? i of -- Nothing -> xs -- Just x -> let !x' = f x -- in update i x' xs --adjust' :: forall a. (a -> a) -> Int -> Seq a -> Seq a -- | O(log(min(i,n-i))). Replace the element at the specified -- position. If the position is out of range, the original sequence is -- returned. update :: Int -> a -> Seq a -> Seq a -- | O(log(min(i,n-i))). The first i elements of a -- sequence. If i is negative, take i s yields -- the empty sequence. If the sequence contains fewer than i -- elements, the whole sequence is returned. take :: Int -> Seq a -> Seq a -- | O(log(min(i,n-i))). Elements of a sequence after the first -- i. If i is negative, drop i s yields -- the whole sequence. If the sequence contains fewer than i -- elements, the empty sequence is returned. drop :: Int -> Seq a -> Seq a -- | O(log(min(i,n-i))). insertAt i x xs inserts -- x into xs at the index i, shifting the rest -- of the sequence over. -- --
-- insertAt 2 x (fromList [a,b,c,d]) = fromList [a,b,x,c,d] -- insertAt 4 x (fromList [a,b,c,d]) = insertAt 10 x (fromList [a,b,c,d]) -- = fromList [a,b,c,d,x] ---- --
-- insertAt i x xs = take i xs >< singleton x >< drop i xs --insertAt :: Int -> a -> Seq a -> Seq a -- | O(log(min(i,n-i))). Delete the element of a sequence at a given -- index. Return the original sequence if the index is out of range. -- --
-- deleteAt 2 [a,b,c,d] = [a,b,d] -- deleteAt 4 [a,b,c,d] = deleteAt (-1) [a,b,c,d] = [a,b,c,d] --deleteAt :: Int -> Seq a -> Seq a -- | O(log(min(i,n-i))). Split a sequence at a given position. -- splitAt i s = (take i s, drop i s). splitAt :: Int -> Seq a -> (Seq a, Seq a) -- | elemIndexL finds the leftmost index of the specified element, -- if it is present, and otherwise Nothing. elemIndexL :: Eq a => a -> Seq a -> Maybe Int -- | elemIndicesL finds the indices of the specified element, from -- left to right (i.e. in ascending order). elemIndicesL :: Eq a => a -> Seq a -> [Int] -- | elemIndexR finds the rightmost index of the specified element, -- if it is present, and otherwise Nothing. elemIndexR :: Eq a => a -> Seq a -> Maybe Int -- | elemIndicesR finds the indices of the specified element, from -- right to left (i.e. in descending order). elemIndicesR :: Eq a => a -> Seq a -> [Int] -- | findIndexL p xs finds the index of the leftmost -- element that satisfies p, if any exist. findIndexL :: (a -> Bool) -> Seq a -> Maybe Int -- | findIndicesL p finds all indices of elements that -- satisfy p, in ascending order. findIndicesL :: (a -> Bool) -> Seq a -> [Int] -- | findIndexR p xs finds the index of the rightmost -- element that satisfies p, if any exist. findIndexR :: (a -> Bool) -> Seq a -> Maybe Int -- | findIndicesR p finds all indices of elements that -- satisfy p, in descending order. findIndicesR :: (a -> Bool) -> Seq a -> [Int] -- | O(n). A generalization of foldMap, -- foldMapWithIndex takes a folding function that also depends on -- the element's index, and applies it to every element in the sequence. foldMapWithIndex :: Monoid m => (Int -> a -> m) -> Seq a -> m -- | foldlWithIndex is a version of foldl that also provides -- access to the index of each element. foldlWithIndex :: (b -> Int -> a -> b) -> b -> Seq a -> b -- | foldrWithIndex is a version of foldr that also provides -- access to the index of each element. foldrWithIndex :: (Int -> a -> b -> b) -> b -> Seq a -> b -- | O(n). A generalization of fmap, mapWithIndex -- takes a mapping function that also depends on the element's index, and -- applies it to every element in the sequence. mapWithIndex :: (Int -> a -> b) -> Seq a -> Seq b -- | traverseWithIndex is a version of traverse that also -- offers access to the index of each element. traverseWithIndex :: Applicative f => (Int -> a -> f b) -> Seq a -> f (Seq b) -- | O(n). The reverse of a sequence. reverse :: Seq a -> Seq a -- | Intersperse an element between the elements of a sequence. -- --
-- intersperse a empty = empty -- intersperse a (singleton x) = singleton x -- intersperse a (fromList [x,y]) = fromList [x,a,y] -- intersperse a (fromList [x,y,z]) = fromList [x,a,y,a,z] --intersperse :: a -> Seq a -> Seq a -- | O(min(n1,n2)). zip takes two sequences and returns a -- sequence of corresponding pairs. If one input is short, excess -- elements are discarded from the right end of the longer sequence. zip :: Seq a -> Seq b -> Seq (a, b) -- | O(min(n1,n2)). zipWith generalizes zip by zipping -- with the function given as the first argument, instead of a tupling -- function. For example, zipWith (+) is applied to two -- sequences to take the sequence of corresponding sums. zipWith :: (a -> b -> c) -> Seq a -> Seq b -> Seq c -- | O(min(n1,n2,n3)). zip3 takes three sequences and returns -- a sequence of triples, analogous to zip. zip3 :: Seq a -> Seq b -> Seq c -> Seq (a, b, c) -- | O(min(n1,n2,n3)). zipWith3 takes a function which -- combines three elements, as well as three sequences and returns a -- sequence of their point-wise combinations, analogous to -- zipWith. zipWith3 :: (a -> b -> c -> d) -> Seq a -> Seq b -> Seq c -> Seq d -- | O(min(n1,n2,n3,n4)). zip4 takes four sequences and -- returns a sequence of quadruples, analogous to zip. zip4 :: Seq a -> Seq b -> Seq c -> Seq d -> Seq (a, b, c, d) -- | O(min(n1,n2,n3,n4)). zipWith4 takes a function which -- combines four elements, as well as four sequences and returns a -- sequence of their point-wise combinations, analogous to -- zipWith. zipWith4 :: (a -> b -> c -> d -> e) -> Seq a -> Seq b -> Seq c -> Seq d -> Seq e -- | Multi-way trees (aka rose trees) and forests. module Data.Tree -- | Multi-way trees, also known as rose trees. data Tree a Node :: a -> Forest a -> Tree a -- | label value [rootLabel] :: Tree a -> a -- | zero or more child trees [subForest] :: Tree a -> Forest a type Forest a = [Tree a] -- | Neat 2-dimensional drawing of a tree. drawTree :: Tree String -> String -- | Neat 2-dimensional drawing of a forest. drawForest :: Forest String -> String -- | The elements of a tree in pre-order. flatten :: Tree a -> [a] -- | Lists of nodes at each level of the tree. levels :: Tree a -> [[a]] -- | Catamorphism on trees. foldTree :: (a -> [b] -> b) -> Tree a -> b -- | Build a tree from a seed value unfoldTree :: (b -> (a, [b])) -> b -> Tree a -- | Build a forest from a list of seed values unfoldForest :: (b -> (a, [b])) -> [b] -> Forest a -- | Monadic tree builder, in depth-first order unfoldTreeM :: Monad m => (b -> m (a, [b])) -> b -> m (Tree a) -- | Monadic forest builder, in depth-first order unfoldForestM :: Monad m => (b -> m (a, [b])) -> [b] -> m (Forest a) -- | Monadic tree builder, in breadth-first order, using an algorithm -- adapted from Breadth-First Numbering: Lessons from a Small Exercise -- in Algorithm Design, by Chris Okasaki, ICFP'00. unfoldTreeM_BF :: Monad m => (b -> m (a, [b])) -> b -> m (Tree a) -- | Monadic forest builder, in breadth-first order, using an algorithm -- adapted from Breadth-First Numbering: Lessons from a Small Exercise -- in Algorithm Design, by Chris Okasaki, ICFP'00. unfoldForestM_BF :: Monad m => (b -> m (a, [b])) -> [b] -> m (Forest a) instance GHC.Generics.Generic1 Data.Tree.Tree instance GHC.Generics.Generic (Data.Tree.Tree a) instance Data.Data.Data a => Data.Data.Data (Data.Tree.Tree a) instance GHC.Show.Show a => GHC.Show.Show (Data.Tree.Tree a) instance GHC.Read.Read a => GHC.Read.Read (Data.Tree.Tree a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Tree.Tree a) instance GHC.Base.Functor Data.Tree.Tree instance GHC.Base.Applicative Data.Tree.Tree instance GHC.Base.Monad Data.Tree.Tree instance Data.Traversable.Traversable Data.Tree.Tree instance Data.Foldable.Foldable Data.Tree.Tree instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Tree.Tree a) -- | An efficient implementation of ordered maps from keys to values -- (dictionaries). -- -- API of this module is strict in the keys, but lazy in the values. If -- you need value-strict maps, use Data.Map.Strict instead. The -- Map type itself is shared between the lazy and strict modules, -- meaning that the same Map value can be passed to functions in -- both modules (although that is rarely needed). -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import qualified Data.Map.Lazy as Map ---- -- The implementation of Map is based on size balanced -- binary trees (or trees of bounded balance) as described by: -- --
-- fromList [(5,'a'), (3,'b')] ! 1 Error: element not in the map -- fromList [(5,'a'), (3,'b')] ! 5 == 'a' --(!) :: Ord k => Map k a -> k -> a infixl 9 ! -- | Same as difference. (\\) :: Ord k => Map k a -> Map k b -> Map k a infixl 9 \\ -- | O(1). Is the map empty? -- --
-- Data.Map.null (empty) == True -- Data.Map.null (singleton 1 'a') == False --null :: Map k a -> Bool -- | O(1). The number of elements in the map. -- --
-- size empty == 0 -- size (singleton 1 'a') == 1 -- size (fromList([(1,'a'), (2,'c'), (3,'b')])) == 3 --size :: Map k a -> Int -- | O(log n). Is the key a member of the map? See also -- notMember. -- --
-- member 5 (fromList [(5,'a'), (3,'b')]) == True -- member 1 (fromList [(5,'a'), (3,'b')]) == False --member :: Ord k => k -> Map k a -> Bool -- | O(log n). Is the key not a member of the map? See also -- member. -- --
-- notMember 5 (fromList [(5,'a'), (3,'b')]) == False -- notMember 1 (fromList [(5,'a'), (3,'b')]) == True --notMember :: Ord k => k -> Map k a -> Bool -- | O(log n). Lookup the value at a key in the map. -- -- The function will return the corresponding value as (Just -- value), or Nothing if the key isn't in the map. -- -- An example of using lookup: -- --
-- import Prelude hiding (lookup)
-- import Data.Map
--
-- employeeDept = fromList([("John","Sales"), ("Bob","IT")])
-- deptCountry = fromList([("IT","USA"), ("Sales","France")])
-- countryCurrency = fromList([("USA", "Dollar"), ("France", "Euro")])
--
-- employeeCurrency :: String -> Maybe String
-- employeeCurrency name = do
-- dept <- lookup name employeeDept
-- country <- lookup dept deptCountry
-- lookup country countryCurrency
--
-- main = do
-- putStrLn $ "John's currency: " ++ (show (employeeCurrency "John"))
-- putStrLn $ "Pete's currency: " ++ (show (employeeCurrency "Pete"))
--
--
-- The output of this program:
--
-- -- John's currency: Just "Euro" -- Pete's currency: Nothing --lookup :: Ord k => k -> Map k a -> Maybe a -- | O(log n). The expression (findWithDefault def k -- map) returns the value at key k or returns default value -- def when the key is not in the map. -- --
-- findWithDefault 'x' 1 (fromList [(5,'a'), (3,'b')]) == 'x' -- findWithDefault 'x' 5 (fromList [(5,'a'), (3,'b')]) == 'a' --findWithDefault :: Ord k => a -> k -> Map k a -> a -- | O(log n). Find largest key smaller than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupLT 3 (fromList [(3,'a'), (5,'b')]) == Nothing -- lookupLT 4 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a') --lookupLT :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(log n). Find smallest key greater than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupGT 4 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b') -- lookupGT 5 (fromList [(3,'a'), (5,'b')]) == Nothing --lookupGT :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(log n). Find largest key smaller or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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') --lookupLE :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(log n). Find smallest key greater or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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 --lookupGE :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(1). The empty map. -- --
-- empty == fromList [] -- size empty == 0 --empty :: Map k a -- | O(1). A map with a single element. -- --
-- singleton 1 'a' == fromList [(1, 'a')] -- size (singleton 1 'a') == 1 --singleton :: k -> a -> Map k a -- | O(log n). Insert a new key and value in the map. If the key is -- already present in the map, the associated value is replaced with the -- supplied value. 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' --insert :: Ord k => k -> a -> Map k a -> Map k a -- | O(log n). Insert with a function, combining new value and old -- value. insertWith f key value mp will insert the pair -- (key, value) into mp if key does not exist in the map. If the -- key does exist, the function will insert the pair (key, 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" --insertWith :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a -- | O(log n). Insert with a function, combining key, new value and -- old value. insertWithKey f key value mp will insert -- the pair (key, value) into mp if key does not exist in the -- map. If the key does exist, the function will insert the pair -- (key,f key new_value old_value). Note that the key passed to -- f is the same key passed to insertWithKey. -- --
-- 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" --insertWithKey :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a -- | O(log n). Combines insert operation with old value retrieval. -- The expression (insertLookupWithKey f k x map) is a -- pair where the first element is equal to (lookup k -- map) and the second element equal to (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")]) --insertLookupWithKey :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a) -- | O(log n). Delete a key and its value from the map. When the key -- is not a member of the map, the original map is returned. -- --
-- 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 --delete :: Ord k => k -> Map k a -> Map k a -- | O(log n). Update a value at a specific key with the result of -- the provided function. When the key is not a member of the map, the -- original map is returned. -- --
-- 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
--
adjust :: Ord k => (a -> a) -> k -> Map k a -> Map k a
-- | O(log n). Adjust a value at a specific key. When the key is not
-- a member of the map, the original map is returned.
--
-- -- 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 --adjustWithKey :: Ord k => (k -> a -> a) -> k -> Map k a -> Map k a -- | O(log n). The expression (update f k map) -- updates the value x at k (if it is in the map). If -- (f x) is Nothing, the element is deleted. If it is -- (Just y), the key k 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" --update :: Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a -- | O(log n). The expression (updateWithKey f k -- map) updates the value x at k (if it is in the -- map). If (f k x) is Nothing, the element is deleted. -- If it is (Just y), the key k 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" --updateWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a -> Map k a -- | O(log n). Lookup and update. See also updateWithKey. The -- function returns changed value, if it is updated. 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 "5:new 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") --updateLookupWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a -> (Maybe a, Map k a) -- | O(log n). The expression (alter f k map) alters -- the value x at k, or absence thereof. alter -- can be used to insert, delete, or update a value in a Map. In -- short : lookup k (alter f k m) = f (lookup k -- m). -- --
-- let f _ = Nothing -- alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] -- alter f 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" -- -- let f _ = Just "c" -- alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "c")] -- alter f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "c")] --alter :: Ord k => (Maybe a -> Maybe a) -> k -> Map k a -> Map k a -- | O(log n). The expression (alterF f k map) -- alters the value x at k, or absence thereof. -- alterF can be used to inspect, insert, delete, or update a -- value in a Map. In short: lookup k <$> -- alterF f k m = f (lookup k m). -- -- Example: -- --
-- interactiveAlter :: Int -> Map Int String -> IO (Map Int 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. When used with -- trivial functors like Identity and Const, it is often -- slightly slower than more specialized combinators like lookup -- and insert. However, when the functor is non-trivial and key -- comparison is not particularly cheap, it is the fastest way. -- -- Note on rewrite rules: -- -- This module includes GHC rewrite rules to optimize alterF for -- the Const and Identity functors. In general, these rules -- improve performance. The sole exception is that when using -- Identity, deleting a key that is already absent takes longer -- than it would without the rules. If you expect this to occur a very -- large fraction of the time, you might consider using a private copy of -- the Identity type. -- -- Note: alterF is a flipped version of the at combinator -- from At. alterF :: (Functor f, Ord k) => (Maybe a -> f (Maybe a)) -> k -> Map k a -> f (Map k a) -- | O(m*log(n/m + 1)), m <= n. The expression (union -- t1 t2) takes the left-biased union of t1 and -- t2. It prefers t1 when duplicate keys are -- encountered, i.e. (union == unionWith -- const). -- --
-- union (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "a"), (7, "C")] --union :: Ord k => Map k a -> Map k a -> Map k a -- | O(m*log(n/m + 1)), m <= n. Union with a combining function. -- --
-- unionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "aA"), (7, "C")] --unionWith :: Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a -- | O(m*log(n/m + 1)), m <= n. Union with a combining function. -- --
-- 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")] --unionWithKey :: Ord k => (k -> a -> a -> a) -> Map k a -> Map k a -> Map k a -- | The union of a list of maps: (unions == foldl -- union empty). -- --
-- 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")] --unions :: Ord k => [Map k a] -> Map k a -- | The union of a list of maps, with a combining operation: -- (unionsWith f == foldl (unionWith f) -- empty). -- --
-- unionsWith (++) [(fromList [(5, "a"), (3, "b")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "A3"), (3, "B3")])] -- == fromList [(3, "bB3"), (5, "aAA3"), (7, "C")] --unionsWith :: Ord k => (a -> a -> a) -> [Map k a] -> Map k a -- | O(m*log(n/m + 1)), m <= n. Difference of two maps. Return -- elements of the first map not existing in the second map. -- --
-- difference (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 3 "b" --difference :: Ord k => Map k a -> Map k b -> Map k a -- | O(n+m). Difference with a combining function. When two equal -- keys are encountered, the combining function is applied to the values -- of these keys. If it returns Nothing, the element is discarded -- (proper set difference). If it returns (Just y), the -- element is updated with a new value y. -- --
-- 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" --differenceWith :: Ord k => (a -> b -> Maybe a) -> Map k a -> Map k b -> Map k a -- | O(n+m). Difference with a combining function. When two equal -- keys are encountered, the combining function is applied to the key and -- both values. If it returns Nothing, the element is discarded -- (proper set difference). If it returns (Just y), the -- element is updated with a new value y. -- --
-- 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" --differenceWithKey :: Ord k => (k -> a -> b -> Maybe a) -> Map k a -> Map k b -> Map k a -- | O(m*log(n/m + 1)), m <= n. Intersection of two maps. Return -- data in the first map for the keys existing in both maps. -- (intersection m1 m2 == intersectionWith const -- m1 m2). -- --
-- intersection (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "a" --intersection :: Ord k => Map k a -> Map k b -> Map k a -- | O(m*log(n/m + 1)), m <= n. Intersection with a combining -- function. -- --
-- intersectionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "aA" --intersectionWith :: Ord k => (a -> b -> c) -> Map k a -> Map k b -> Map k c -- | O(m*log(n/m + 1)), m <= n. Intersection with a combining -- function. -- --
-- 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" --intersectionWithKey :: Ord k => (k -> a -> b -> c) -> Map k a -> Map k b -> Map k c -- | O(n+m). An unsafe general combining function. -- -- WARNING: This function can produce corrupt maps and its results may -- depend on the internal structures of its inputs. Users should prefer -- merge or mergeA. -- -- When mergeWithKey is given three arguments, it is inlined to -- the call site. You should therefore use mergeWithKey only to -- define 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 mergeWithKey combine only1 only2, a -- function combining two Maps is created, such that -- --
-- map (++ "x") (fromList [(5,"a"), (3,"b")]) == fromList [(3, "bx"), (5, "ax")] --map :: (a -> b) -> Map k a -> Map k b -- | O(n). Map a function over all values in the map. -- --
-- let f key x = (show key) ++ ":" ++ x -- mapWithKey f (fromList [(5,"a"), (3,"b")]) == fromList [(3, "3:b"), (5, "5:a")] --mapWithKey :: (k -> a -> b) -> Map k a -> Map k b -- | O(n). traverseWithKey f m == fromList -- $ traverse ((k, v) -> (,) k $ f k v) -- (toList m) That is, behaves exactly like a regular -- 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 --traverseWithKey :: Applicative t => (k -> a -> t b) -> Map k a -> t (Map k b) -- | O(n). Traverse keys/values and collect the Just results. traverseMaybeWithKey :: Applicative f => (k -> a -> f (Maybe b)) -> Map k a -> f (Map k b) -- | O(n). The function mapAccum threads an accumulating -- argument through the map in ascending order of keys. -- --
-- let f a b = (a ++ b, b ++ "X")
-- mapAccum f "Everything: " (fromList [(5,"a"), (3,"b")]) == ("Everything: ba", fromList [(3, "bX"), (5, "aX")])
--
mapAccum :: (a -> b -> (a, c)) -> a -> Map k b -> (a, Map k c)
-- | O(n). The function mapAccumWithKey threads an
-- accumulating argument through the map in ascending order of keys.
--
--
-- 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")])
--
mapAccumWithKey :: (a -> k -> b -> (a, c)) -> a -> Map k b -> (a, Map k c)
-- | O(n). The function mapAccumR threads an accumulating
-- argument through the map in descending order of keys.
mapAccumRWithKey :: (a -> k -> b -> (a, c)) -> a -> Map k b -> (a, Map k c)
-- | O(n*log n). mapKeys f s is the map obtained by
-- applying f 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" --mapKeys :: Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a -- | O(n*log n). mapKeysWith c f s is the map -- obtained by applying f 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" --mapKeysWith :: Ord k2 => (a -> a -> a) -> (k1 -> k2) -> Map k1 a -> Map k2 a -- | O(n). mapKeysMonotonic f s == mapKeys f -- s, but works only when f 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 better performance than -- mapKeys. -- --
-- mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")]) == fromList [(6, "b"), (10, "a")] -- valid (mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")])) == True -- valid (mapKeysMonotonic (\ _ -> 1) (fromList [(5,"a"), (3,"b")])) == False --mapKeysMonotonic :: (k1 -> k2) -> Map k1 a -> Map k2 a -- | O(n). Fold the values in the map using the given -- right-associative binary operator, such that foldr f z == -- foldr f z . elems. -- -- For example, -- --
-- elems map = foldr (:) [] map ---- --
-- let f a len = len + (length a) -- foldr f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldr :: (a -> b -> b) -> b -> Map k a -> b -- | O(n). Fold the values in the map using the given -- left-associative binary operator, such that foldl f z == -- foldl f z . elems. -- -- For example, -- --
-- elems = reverse . foldl (flip (:)) [] ---- --
-- let f len a = len + (length a) -- foldl f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldl :: (a -> b -> a) -> a -> Map k b -> a -- | O(n). Fold the keys and values in the map using the given -- right-associative binary operator, such that 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)"
--
foldrWithKey :: (k -> a -> b -> b) -> b -> Map k a -> b
-- | O(n). Fold the keys and values in the map using the given
-- left-associative binary operator, such that 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)"
--
foldlWithKey :: (a -> k -> b -> a) -> a -> Map k b -> a
-- | O(n). Fold the keys and values in the map using the given
-- monoid, such that
--
-- -- foldMapWithKey f = fold . mapWithKey f ---- -- This can be an asymptotically faster than foldrWithKey or -- foldlWithKey for some monoids. foldMapWithKey :: Monoid m => (k -> a -> m) -> Map k a -> m -- | O(n). A strict version of foldr. Each application of the -- operator is evaluated before using the result in the next application. -- This function is strict in the starting value. foldr' :: (a -> b -> b) -> b -> Map k a -> b -- | O(n). A strict version of foldl. 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 -> Map k b -> a -- | O(n). A strict version of foldrWithKey. Each application -- of the operator is evaluated before using the result in the next -- application. This function is strict in the starting value. foldrWithKey' :: (k -> a -> b -> b) -> b -> Map k a -> b -- | O(n). A strict version of foldlWithKey. 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 -> k -> b -> a) -> a -> Map k b -> a -- | O(n). Return all elements of the map in the ascending order of -- their keys. Subject to list fusion. -- --
-- elems (fromList [(5,"a"), (3,"b")]) == ["b","a"] -- elems empty == [] --elems :: Map k a -> [a] -- | O(n). Return all keys of the map in ascending order. Subject to -- list fusion. -- --
-- keys (fromList [(5,"a"), (3,"b")]) == [3,5] -- keys empty == [] --keys :: Map k a -> [k] -- | O(n). An alias for toAscList. Return 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 == [] --assocs :: Map k a -> [(k, a)] -- | O(n). The set of all keys of the map. -- --
-- keysSet (fromList [(5,"a"), (3,"b")]) == Data.Set.fromList [3,5] -- keysSet empty == Data.Set.empty --keysSet :: Map k a -> Set k -- | O(n). Build a map from a set of keys and a function which for -- each key computes its value. -- --
-- fromSet (\k -> replicate k 'a') (Data.Set.fromList [3, 5]) == fromList [(5,"aaaaa"), (3,"aaa")] -- fromSet undefined Data.Set.empty == empty --fromSet :: (k -> a) -> Set k -> Map k a -- | O(n). Convert the map to a list of key/value pairs. Subject to -- list fusion. -- --
-- toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] -- toList empty == [] --toList :: Map k a -> [(k, a)] -- | O(n*log n). Build a map from a list of key/value pairs. See -- also fromAscList. If the list contains more than one value for -- the same key, the last value for the key is retained. -- -- If the keys of the list are ordered, linear-time implementation is -- used, with the performance equal to fromDistinctAscList. -- --
-- 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")] --fromList :: Ord k => [(k, a)] -> Map k a -- | O(n*log n). Build a map from a list of key/value pairs with a -- combining function. See also fromAscListWith. -- --
-- fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")] -- fromListWith (++) [] == empty --fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a -- | O(n*log n). Build a map from a list of key/value pairs with a -- combining function. See also fromAscListWithKey. -- --
-- let f k a1 a2 = (show k) ++ a1 ++ a2 -- fromListWithKey f [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "3ab"), (5, "5a5ba")] -- fromListWithKey f [] == empty --fromListWithKey :: Ord k => (k -> a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in ascending order. Subject to list fusion. -- --
-- toAscList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] --toAscList :: Map k a -> [(k, a)] -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in descending order. Subject to list fusion. -- --
-- toDescList (fromList [(5,"a"), (3,"b")]) == [(5,"a"), (3,"b")] --toDescList :: Map k a -> [(k, a)] -- | O(n). Build a map from an ascending list in linear time. The -- precondition (input list is ascending) is not checked. -- --
-- fromAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] -- fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")] -- valid (fromAscList [(3,"b"), (5,"a"), (5,"b")]) == True -- valid (fromAscList [(5,"a"), (3,"b"), (5,"b")]) == False --fromAscList :: Eq k => [(k, a)] -> Map k a -- | O(n). Build a map from an ascending list in linear time with a -- combining function for equal keys. The precondition (input list is -- ascending) is not checked. -- --
-- fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")] -- valid (fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")]) == True -- valid (fromAscListWith (++) [(5,"a"), (3,"b"), (5,"b")]) == False --fromAscListWith :: Eq k => (a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from an ascending list in linear time with a -- combining function for equal keys. The precondition (input list is -- ascending) is not checked. -- --
-- let f k a1 a2 = (show k) ++ ":" ++ a1 ++ a2 -- fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")] == fromList [(3, "b"), (5, "5:b5:ba")] -- valid (fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")]) == True -- valid (fromAscListWithKey f [(5,"a"), (3,"b"), (5,"b"), (5,"b")]) == False --fromAscListWithKey :: Eq k => (k -> a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from an ascending list of distinct elements -- in linear time. The precondition is not checked. -- --
-- fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] -- valid (fromDistinctAscList [(3,"b"), (5,"a")]) == True -- valid (fromDistinctAscList [(3,"b"), (5,"a"), (5,"b")]) == False --fromDistinctAscList :: [(k, a)] -> Map k a -- | O(n). Build a map from a descending list in linear time. The -- precondition (input list is descending) is not checked. -- --
-- fromDescList [(5,"a"), (3,"b")] == fromList [(3, "b"), (5, "a")] -- fromDescList [(5,"a"), (5,"b"), (3,"b")] == fromList [(3, "b"), (5, "b")] -- valid (fromDescList [(5,"a"), (5,"b"), (3,"b")]) == True -- valid (fromDescList [(5,"a"), (3,"b"), (5,"b")]) == False --fromDescList :: Eq k => [(k, a)] -> Map k a -- | O(n). Build a map from a descending list in linear time with a -- combining function for equal keys. The precondition (input list is -- descending) is not checked. -- --
-- fromDescListWith (++) [(5,"a"), (5,"b"), (3,"b")] == fromList [(3, "b"), (5, "ba")] -- valid (fromDescListWith (++) [(5,"a"), (5,"b"), (3,"b")]) == True -- valid (fromDescListWith (++) [(5,"a"), (3,"b"), (5,"b")]) == False --fromDescListWith :: Eq k => (a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from a descending list in linear time with a -- combining function for equal keys. The precondition (input list is -- descending) is not checked. -- --
-- let f k a1 a2 = (show k) ++ ":" ++ a1 ++ a2 -- fromDescListWithKey f [(5,"a"), (5,"b"), (5,"b"), (3,"b")] == fromList [(3, "b"), (5, "5:b5:ba")] -- valid (fromDescListWithKey f [(5,"a"), (5,"b"), (5,"b"), (3,"b")]) == True -- valid (fromDescListWithKey f [(5,"a"), (3,"b"), (5,"b"), (5,"b")]) == False --fromDescListWithKey :: Eq k => (k -> a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from a descending list of distinct elements -- in linear time. The precondition is not checked. -- --
-- fromDistinctDescList [(5,"a"), (3,"b")] == fromList [(3, "b"), (5, "a")] -- valid (fromDistinctDescList [(5,"a"), (3,"b")]) == True -- valid (fromDistinctDescList [(5,"a"), (5,"b"), (3,"b")]) == False --fromDistinctDescList :: [(k, a)] -> Map k a -- | O(n). Filter all values that satisfy the predicate. -- --
-- 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 --filter :: (a -> Bool) -> Map k a -> Map k a -- | O(n). Filter all keys/values that satisfy the predicate. -- --
-- filterWithKey (\k _ -> k > 4) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" --filterWithKey :: (k -> a -> Bool) -> Map k a -> Map k a -- | O(m*log(nm + 1)), m <= n/. Restrict a Map to only -- those keys found in a Set. -- --
-- m restrictKeys s = filterWithKey (k _ -> k `member' s) m --restrictKeys :: Ord k => Map k a -> Set k -> Map k a -- | O(m*log(nm + 1)), m <= n/. Remove all keys in a Set -- from a Map. -- --
-- m withoutKeys s = filterWithKey (k _ -> k `notMember' s) m --withoutKeys :: Ord k => Map k a -> Set k -> Map k a -- | O(n). Partition the map according to a predicate. The first map -- contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partition :: (a -> Bool) -> Map k a -> (Map k a, Map k a) -- | O(n). Partition the map according to a predicate. The first map -- contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partitionWithKey :: (k -> a -> Bool) -> Map k a -> (Map k a, Map k a) -- | O(log n). Take while a predicate on the keys holds. The user is -- responsible for ensuring that for all keys j and k -- in the map, j < k ==> p j >= p k. See note at -- spanAntitone. -- --
-- takeWhileAntitone p = fromDistinctAscList . takeWhile (p . fst) . toList -- takeWhileAntitone p = filterWithKey (k _ -> p k) --takeWhileAntitone :: (k -> Bool) -> Map k a -> Map k a -- | O(log n). Drop while a predicate on the keys holds. The user is -- responsible for ensuring that for all keys j and k -- in the map, j < k ==> p j >= p k. See note at -- spanAntitone. -- --
-- dropWhileAntitone p = fromDistinctAscList . dropWhile (p . fst) . toList -- dropWhileAntitone p = filterWithKey (k -> not (p k)) --dropWhileAntitone :: (k -> Bool) -> Map k a -> Map k a -- | O(log n). Divide a map at the point where a predicate on the -- keys stops holding. The user is responsible for ensuring that for all -- keys j and k in the map, j < k ==> p j -- >= p k. -- --
-- spanAntitone p xs = (takeWhileAntitone p xs, dropWhileAntitone p xs) -- spanAntitone p xs = partition p xs ---- -- Note: if p is not actually antitone, then -- spanAntitone will split the map at some unspecified -- point where the predicate switches from holding to not holding (where -- the predicate is seen to hold before the first key and to fail after -- the last key). spanAntitone :: (k -> Bool) -> Map k a -> (Map k a, Map k a) -- | O(n). Map values and collect the 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" --mapMaybe :: (a -> Maybe b) -> Map k a -> Map k b -- | O(n). Map keys/values and collect the 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"
--
mapMaybeWithKey :: (k -> a -> Maybe b) -> Map k a -> Map k b
-- | O(n). Map values and separate the 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")]) --mapEither :: (a -> Either b c) -> Map k a -> (Map k b, Map k c) -- | O(n). Map keys/values and separate the 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")]) --mapEitherWithKey :: (k -> a -> Either b c) -> Map k a -> (Map k b, Map k c) -- | O(log n). The expression (split k map) is a -- pair (map1,map2) where the keys in map1 are smaller -- than k and the 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) --split :: Ord k => k -> Map k a -> (Map k a, Map k a) -- | O(log n). The expression (splitLookup k map) -- splits a map just like split but also returns lookup -- k 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) --splitLookup :: Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a) -- | O(1). Decompose a map into pieces based on the structure of the -- underlying tree. This function is useful for consuming a map in -- parallel. -- -- 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] ['a'..])) == -- [fromList [(1,'a'),(2,'b'),(3,'c')],fromList [(4,'d')],fromList [(5,'e'),(6,'f')]] ---- --
-- splitRoot empty == [] ---- -- Note that the current implementation does not return more than three -- submaps, but you should not depend on this behaviour because it can -- change in the future without notice. splitRoot :: Map k b -> [Map k b] -- | O(m*log(nm + 1)), m <= n/. This function is defined as -- (isSubmapOf = isSubmapOfBy (==)). isSubmapOf :: (Ord k, Eq a) => Map k a -> Map k a -> Bool -- | O(m*log(nm + 1)), m <= n/. The expression -- (isSubmapOfBy f t1 t2) returns True if all keys -- in t1 are in tree t2, and when f returns -- True when applied to their respective values. For example, the -- following expressions are all True: -- --
-- isSubmapOfBy (==) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (<=) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (==) (fromList [('a',1),('b',2)]) (fromList [('a',1),('b',2)])
--
--
-- But the following are all False:
--
--
-- isSubmapOfBy (==) (fromList [('a',2)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (<) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (==) (fromList [('a',1),('b',2)]) (fromList [('a',1)])
--
isSubmapOfBy :: Ord k => (a -> b -> Bool) -> Map k a -> Map k b -> Bool
-- | O(m*log(nm + 1)), m <= n/. Is this a proper submap? (ie. a
-- submap but not equal). Defined as (isProperSubmapOf =
-- isProperSubmapOfBy (==)).
isProperSubmapOf :: (Ord k, Eq a) => Map k a -> Map k a -> Bool
-- | O(m*log(nm + 1)), m <= n/. Is this a proper submap? (ie. a
-- submap but not equal). The expression (isProperSubmapOfBy f
-- m1 m2) returns True when m1 and 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)]) --isProperSubmapOfBy :: Ord k => (a -> b -> Bool) -> Map k a -> Map k b -> Bool -- | O(log n). Lookup the index of a key, which is its -- zero-based index in the sequence sorted by keys. The index is a number -- from 0 up to, but not including, the size of the map. -- --
-- isJust (lookupIndex 2 (fromList [(5,"a"), (3,"b")])) == False -- fromJust (lookupIndex 3 (fromList [(5,"a"), (3,"b")])) == 0 -- fromJust (lookupIndex 5 (fromList [(5,"a"), (3,"b")])) == 1 -- isJust (lookupIndex 6 (fromList [(5,"a"), (3,"b")])) == False --lookupIndex :: Ord k => k -> Map k a -> Maybe Int -- | O(log n). Return the index of a key, which is its -- zero-based index in the sequence sorted by keys. The index is a number -- from 0 up to, but not including, the size of the map. -- Calls error when the key is not a member of the map. -- --
-- findIndex 2 (fromList [(5,"a"), (3,"b")]) Error: element is not in the map -- findIndex 3 (fromList [(5,"a"), (3,"b")]) == 0 -- findIndex 5 (fromList [(5,"a"), (3,"b")]) == 1 -- findIndex 6 (fromList [(5,"a"), (3,"b")]) Error: element is not in the map --findIndex :: Ord k => k -> Map k a -> Int -- | O(log n). Retrieve an element by its index, i.e. by its -- zero-based index in the sequence sorted by keys. If the index -- is out of range (less than zero, greater or equal to size of -- the map), error is called. -- --
-- elemAt 0 (fromList [(5,"a"), (3,"b")]) == (3,"b") -- elemAt 1 (fromList [(5,"a"), (3,"b")]) == (5, "a") -- elemAt 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range --elemAt :: Int -> Map k a -> (k, a) -- | O(log n). Update the element at index, i.e. by its -- zero-based index in the sequence sorted by keys. If the index -- is out of range (less than zero, greater or equal to size of -- the map), error is called. -- --
-- updateAt (\ _ _ -> Just "x") 0 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "x"), (5, "a")] -- updateAt (\ _ _ -> Just "x") 1 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "x")] -- updateAt (\ _ _ -> Just "x") 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range -- updateAt (\ _ _ -> Just "x") (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range -- updateAt (\_ _ -> Nothing) 0 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" -- updateAt (\_ _ -> Nothing) 1 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" -- updateAt (\_ _ -> Nothing) 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range -- updateAt (\_ _ -> Nothing) (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range --updateAt :: (k -> a -> Maybe a) -> Int -> Map k a -> Map k a -- | O(log n). Delete the element at index, i.e. by its -- zero-based index in the sequence sorted by keys. If the index -- is out of range (less than zero, greater or equal to size of -- the map), error is called. -- --
-- deleteAt 0 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" -- deleteAt 1 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" -- deleteAt 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range -- deleteAt (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range --deleteAt :: Int -> Map k a -> Map k a -- | Take a given number of entries in key order, beginning with the -- smallest keys. -- --
-- take n = fromDistinctAscList . take n . toAscList --take :: Int -> Map k a -> Map k a -- | Drop a given number of entries in key order, beginning with the -- smallest keys. -- --
-- drop n = fromDistinctAscList . drop n . toAscList --drop :: Int -> Map k a -> Map k a -- | O(log n). Split a map at a particular index. -- --
-- splitAt !n !xs = (take n xs, drop n xs) --splitAt :: Int -> Map k a -> (Map k a, Map k a) -- | O(log n). The minimal key of the map. Calls error if the -- map is empty. -- --
-- findMin (fromList [(5,"a"), (3,"b")]) == (3,"b") -- findMin empty Error: empty map has no minimal element --findMin :: Map k a -> (k, a) -- | O(log n). The maximal key of the map. Calls error if the -- map is empty. -- --
-- findMax (fromList [(5,"a"), (3,"b")]) == (5,"a") -- findMax empty Error: empty map has no maximal element --findMax :: Map k a -> (k, a) -- | O(log n). Delete the minimal key. Returns an empty map if the -- map is empty. -- --
-- deleteMin (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(5,"a"), (7,"c")] -- deleteMin empty == empty --deleteMin :: Map k a -> Map k a -- | O(log n). Delete the maximal key. Returns an empty map if the -- map is empty. -- --
-- deleteMax (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(3,"b"), (5,"a")] -- deleteMax empty == empty --deleteMax :: Map k a -> Map k a -- | O(log n). Delete and find the minimal element. -- --
-- deleteFindMin (fromList [(5,"a"), (3,"b"), (10,"c")]) == ((3,"b"), fromList[(5,"a"), (10,"c")]) -- deleteFindMin Error: can not return the minimal element of an empty map --deleteFindMin :: Map k a -> ((k, a), Map k a) -- | O(log n). Delete and find the maximal element. -- --
-- deleteFindMax (fromList [(5,"a"), (3,"b"), (10,"c")]) == ((10,"c"), fromList [(3,"b"), (5,"a")]) -- deleteFindMax empty Error: can not return the maximal element of an empty map --deleteFindMax :: Map k a -> ((k, a), Map k a) -- | O(log n). Update the value at the minimal key. -- --
-- 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"
--
updateMin :: (a -> Maybe a) -> Map k a -> Map k a
-- | O(log n). Update the value at the maximal key.
--
--
-- 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"
--
updateMax :: (a -> Maybe a) -> Map k a -> Map k a
-- | O(log n). Update the value at the minimal key.
--
-- -- 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" --updateMinWithKey :: (k -> a -> Maybe a) -> Map k a -> Map k a -- | O(log n). Update the value at the maximal key. -- --
-- 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" --updateMaxWithKey :: (k -> a -> Maybe a) -> Map k a -> Map k a -- | O(log n). Retrieves the value associated with minimal key of -- the map, and the map stripped of that element, or Nothing if -- passed an empty map. -- --
-- minView (fromList [(5,"a"), (3,"b")]) == Just ("b", singleton 5 "a")
-- minView empty == Nothing
--
minView :: Map k a -> Maybe (a, Map k a)
-- | O(log n). Retrieves the value associated with maximal key of
-- the map, and the map stripped of that element, or Nothing if
-- passed an empty map.
--
--
-- maxView (fromList [(5,"a"), (3,"b")]) == Just ("a", singleton 3 "b")
-- maxView empty == Nothing
--
maxView :: Map k a -> Maybe (a, Map k a)
-- | O(log n). Retrieves the minimal (key,value) pair of the map,
-- and the map stripped of that element, or Nothing if passed an
-- empty map.
--
-- -- minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a") -- minViewWithKey empty == Nothing --minViewWithKey :: Map k a -> Maybe ((k, a), Map k a) -- | O(log n). Retrieves the maximal (key,value) pair of the map, -- and the map stripped of that element, or Nothing if passed an -- empty map. -- --
-- maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b") -- maxViewWithKey empty == Nothing --maxViewWithKey :: Map k a -> Maybe ((k, a), Map k a) -- | O(n). Show the tree that implements the map. The tree is shown -- in a compressed, hanging format. See showTreeWith. -- | Deprecated: This function is being removed from the public API. showTree :: (Show k, Show a) => Map k a -> String -- | O(n). The expression (showTreeWith showelem hang -- wide map) shows the tree that implements the map. Elements are -- shown using the showElem function. If hang is -- True, a hanging tree is shown otherwise a rotated tree -- is shown. If wide is True, an extra wide version is -- shown. -- --
-- Map> let t = fromDistinctAscList [(x,()) | x <- [1..5]] -- Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True False t -- (4,()) -- +--(2,()) -- | +--(1,()) -- | +--(3,()) -- +--(5,()) -- -- Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True True t -- (4,()) -- | -- +--(2,()) -- | | -- | +--(1,()) -- | | -- | +--(3,()) -- | -- +--(5,()) -- -- Map> putStrLn $ showTreeWith (\k x -> show (k,x)) False True t -- +--(5,()) -- | -- (4,()) -- | -- | +--(3,()) -- | | -- +--(2,()) -- | -- +--(1,()) ---- | Deprecated: This function is being removed from the public API. showTreeWith :: (k -> a -> String) -> Bool -> Bool -> Map k a -> String -- | O(n). Test if the internal map structure is valid. -- --
-- valid (fromAscList [(3,"b"), (5,"a")]) == True -- valid (fromAscList [(5,"a"), (3,"b")]) == False --valid :: Ord k => Map k a -> Bool -- | This module defines an API for writing functions that merge two maps. -- The key functions are merge and mergeA. Each of these -- can be used with several different "merge tactics". -- -- The merge and mergeA functions are shared by the lazy -- and strict modules. Only the choice of merge tactics determines -- strictness. If you use mapMissing from -- Data.Map.Strict.Merge then the results will be forced before -- they are inserted. If you use mapMissing from this module then -- they will not. -- --
-- 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, -- --
-- 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) --merge :: Ord k => SimpleWhenMissing k a c -> SimpleWhenMissing k b c -> SimpleWhenMatched k a b c -> Map k a -> Map k b -> Map k c -- | 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 :: (k -> x -> y -> Maybe z) -- -> SimpleWhenMatched k x y z --zipWithMaybeMatched :: Applicative f => (k -> x -> y -> Maybe z) -> WhenMatched f k x y z -- | 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 :: (k -> x -> y -> z) -- -> SimpleWhenMatched k x y z --zipWithMatched :: Applicative f => (k -> x -> y -> z) -> WhenMatched f k x y z -- | 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 :: (k -> x -> Maybe y) -> SimpleWhenMissing k x y ---- --
-- mapMaybeMissing f = traverseMaybeMissing (\k x -> pure (f k x)) ---- -- but mapMaybeMissing uses fewer unnecessary Applicative -- operations. mapMaybeMissing :: Applicative f => (k -> x -> Maybe y) -> WhenMissing f k x y -- | Drop all the entries whose keys are missing from the other map. -- --
-- dropMissing :: SimpleWhenMissing k x y ---- --
-- dropMissing = mapMaybeMissing (\_ _ -> Nothing) ---- -- but dropMissing is much faster. dropMissing :: Applicative f => WhenMissing f k x y -- | Preserve, unchanged, the entries whose keys are missing from the other -- map. -- --
-- preserveMissing :: SimpleWhenMissing k x x ---- --
-- preserveMissing = Lazy.Merge.mapMaybeMissing (\_ x -> Just x) ---- -- but preserveMissing is much faster. preserveMissing :: Applicative f => WhenMissing f k x x -- | Map over the entries whose keys are missing from the other map. -- --
-- mapMissing :: (k -> x -> y) -> SimpleWhenMissing k x y ---- --
-- mapMissing f = mapMaybeMissing (\k x -> Just $ f k x) ---- -- but mapMissing is somewhat faster. mapMissing :: Applicative f => (k -> x -> y) -> WhenMissing f k x y -- | Filter the entries whose keys are missing from the other map. -- --
-- filterMissing :: (k -> x -> Bool) -> SimpleWhenMissing k x x ---- --
-- filterMissing f = Lazy.Merge.mapMaybeMissing $ \k x -> guard (f k x) *> Just x ---- -- but this should be a little faster. filterMissing :: Applicative f => (k -> x -> Bool) -> WhenMissing f k x x -- | 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 k -> x -> f (Maybe z) -- . data WhenMissing f k x y -- | A tactic for dealing with keys present in both maps in merge or -- mergeA. -- -- A tactic of type WhenMatched f k x y z is an abstract -- representation of a function of type k -> x -> y -> f -- (Maybe z) . data WhenMatched f k x y z -- | 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, -- --
-- filterAMissing f = Lazy.Merge.traverseMaybeMissing $ -- k x -> (b -> guard b *> Just x) $ f k x ---- -- but this should be a little faster. filterAMissing :: Applicative f => (k -> x -> f Bool) -> WhenMissing f k x x -- | Map covariantly over a WhenMissing f k x. mapWhenMissing :: (Applicative f, Monad f) => (a -> b) -> WhenMissing f k x a -> WhenMissing f k x b -- | Map covariantly over a WhenMatched f k x y. mapWhenMatched :: Functor f => (a -> b) -> WhenMatched f k x y a -> WhenMatched f k x y b -- | Map contravariantly over a WhenMissing f k _ x. lmapWhenMissing :: (b -> a) -> WhenMissing f k a x -> WhenMissing f k b x -- | Map contravariantly over a WhenMatched f k _ y z. contramapFirstWhenMatched :: (b -> a) -> WhenMatched f k a y z -> WhenMatched f k b y z -- | Map contravariantly over a WhenMatched f k x _ z. contramapSecondWhenMatched :: (b -> a) -> WhenMatched f k x a z -> WhenMatched f k x b z -- | Along with zipWithMaybeAMatched, witnesses the isomorphism between -- WhenMatched f k x y z and k -> x -> y -> f -- (Maybe z). runWhenMatched :: WhenMatched f k x y z -> k -> x -> y -> f (Maybe z) -- | Along with traverseMaybeMissing, witnesses the isomorphism between -- WhenMissing f k x y and k -> x -> f (Maybe y). runWhenMissing :: WhenMissing f k x y -> k -> x -> f (Maybe y) -- | An efficient implementation of ordered maps from keys to values -- (dictionaries). -- -- API of this module is strict in both the keys and the values. If you -- need value-lazy maps, use Data.Map.Lazy instead. The Map -- type is shared between the lazy and strict modules, meaning that the -- same Map value can be passed to functions in both modules -- (although that is rarely needed). -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import qualified Data.Map.Strict as Map ---- -- The implementation of Map is based on size balanced -- binary trees (or trees of bounded balance) as described by: -- --
-- fromList [(5,'a'), (3,'b')] ! 1 Error: element not in the map -- fromList [(5,'a'), (3,'b')] ! 5 == 'a' --(!) :: Ord k => Map k a -> k -> a infixl 9 ! -- | Same as difference. (\\) :: Ord k => Map k a -> Map k b -> Map k a infixl 9 \\ -- | O(1). Is the map empty? -- --
-- Data.Map.null (empty) == True -- Data.Map.null (singleton 1 'a') == False --null :: Map k a -> Bool -- | O(1). The number of elements in the map. -- --
-- size empty == 0 -- size (singleton 1 'a') == 1 -- size (fromList([(1,'a'), (2,'c'), (3,'b')])) == 3 --size :: Map k a -> Int -- | O(log n). Is the key a member of the map? See also -- notMember. -- --
-- member 5 (fromList [(5,'a'), (3,'b')]) == True -- member 1 (fromList [(5,'a'), (3,'b')]) == False --member :: Ord k => k -> Map k a -> Bool -- | O(log n). Is the key not a member of the map? See also -- member. -- --
-- notMember 5 (fromList [(5,'a'), (3,'b')]) == False -- notMember 1 (fromList [(5,'a'), (3,'b')]) == True --notMember :: Ord k => k -> Map k a -> Bool -- | O(log n). Lookup the value at a key in the map. -- -- The function will return the corresponding value as (Just -- value), or Nothing if the key isn't in the map. -- -- An example of using lookup: -- --
-- import Prelude hiding (lookup)
-- import Data.Map
--
-- employeeDept = fromList([("John","Sales"), ("Bob","IT")])
-- deptCountry = fromList([("IT","USA"), ("Sales","France")])
-- countryCurrency = fromList([("USA", "Dollar"), ("France", "Euro")])
--
-- employeeCurrency :: String -> Maybe String
-- employeeCurrency name = do
-- dept <- lookup name employeeDept
-- country <- lookup dept deptCountry
-- lookup country countryCurrency
--
-- main = do
-- putStrLn $ "John's currency: " ++ (show (employeeCurrency "John"))
-- putStrLn $ "Pete's currency: " ++ (show (employeeCurrency "Pete"))
--
--
-- The output of this program:
--
-- -- John's currency: Just "Euro" -- Pete's currency: Nothing --lookup :: Ord k => k -> Map k a -> Maybe a -- | O(log n). The expression (findWithDefault def k -- map) returns the value at key k or returns default value -- def when the key is not in the map. -- --
-- findWithDefault 'x' 1 (fromList [(5,'a'), (3,'b')]) == 'x' -- findWithDefault 'x' 5 (fromList [(5,'a'), (3,'b')]) == 'a' --findWithDefault :: Ord k => a -> k -> Map k a -> a -- | O(log n). Find largest key smaller than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupLT 3 (fromList [(3,'a'), (5,'b')]) == Nothing -- lookupLT 4 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a') --lookupLT :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(log n). Find smallest key greater than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupGT 4 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b') -- lookupGT 5 (fromList [(3,'a'), (5,'b')]) == Nothing --lookupGT :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(log n). Find largest key smaller or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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') --lookupLE :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(log n). Find smallest key greater or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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 --lookupGE :: Ord k => k -> Map k v -> Maybe (k, v) -- | O(1). The empty map. -- --
-- empty == fromList [] -- size empty == 0 --empty :: Map k a -- | O(1). A map with a single element. -- --
-- singleton 1 'a' == fromList [(1, 'a')] -- size (singleton 1 'a') == 1 --singleton :: k -> a -> Map k a -- | O(log n). Insert a new key and value in the map. If the key is -- already present in the map, the associated value is replaced with the -- supplied value. 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' --insert :: Ord k => k -> a -> Map k a -> Map k a -- | O(log n). Insert with a function, combining new value and old -- value. insertWith f key value mp will insert the pair -- (key, value) into mp if key does not exist in the map. If the -- key does exist, the function will insert the pair (key, 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" --insertWith :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a -- | O(log n). Insert with a function, combining key, new value and -- old value. insertWithKey f key value mp will insert -- the pair (key, value) into mp if key does not exist in the -- map. If the key does exist, the function will insert the pair -- (key,f key new_value old_value). Note that the key passed to -- f is the same key passed to insertWithKey. -- --
-- 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" --insertWithKey :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a -- | O(log n). Combines insert operation with old value retrieval. -- The expression (insertLookupWithKey f k x map) is a -- pair where the first element is equal to (lookup k -- map) and the second element equal to (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")]) --insertLookupWithKey :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a) -- | O(log n). Delete a key and its value from the map. When the key -- is not a member of the map, the original map is returned. -- --
-- 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 --delete :: Ord k => k -> Map k a -> Map k a -- | O(log n). Update a value at a specific key with the result of -- the provided function. When the key is not a member of the map, the -- original map is returned. -- --
-- 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
--
adjust :: Ord k => (a -> a) -> k -> Map k a -> Map k a
-- | O(log n). Adjust a value at a specific key. When the key is not
-- a member of the map, the original map is returned.
--
-- -- 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 --adjustWithKey :: Ord k => (k -> a -> a) -> k -> Map k a -> Map k a -- | O(log n). The expression (update f k map) -- updates the value x at k (if it is in the map). If -- (f x) is Nothing, the element is deleted. If it is -- (Just y), the key k 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" --update :: Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a -- | O(log n). The expression (updateWithKey f k -- map) updates the value x at k (if it is in the -- map). If (f k x) is Nothing, the element is deleted. -- If it is (Just y), the key k 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" --updateWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a -> Map k a -- | O(log n). Lookup and update. See also updateWithKey. The -- function returns changed value, if it is updated. 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 "5:new 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") --updateLookupWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a -> (Maybe a, Map k a) -- | O(log n). The expression (alter f k map) alters -- the value x at k, or absence thereof. alter -- can be used to insert, delete, or update a value in a Map. In -- short : lookup k (alter f k m) = f (lookup k -- m). -- --
-- let f _ = Nothing -- alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")] -- alter f 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" -- -- let f _ = Just "c" -- alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "c")] -- alter f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "c")] --alter :: Ord k => (Maybe a -> Maybe a) -> k -> Map k a -> Map k a -- | O(log n). The expression (alterF f k map) -- alters the value x at k, or absence thereof. -- alterF can be used to inspect, insert, delete, or update a -- value in a Map. In short: lookup k <$> -- alterF f k m = f (lookup k m). -- -- Example: -- --
-- interactiveAlter :: Int -> Map Int String -> IO (Map Int 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. When used with -- trivial functors like Identity and Const, it is often -- slightly slower than more specialized combinators like lookup -- and insert. However, when the functor is non-trivial and key -- comparison is not particularly cheap, it is the fastest way. -- -- Note on rewrite rules: -- -- This module includes GHC rewrite rules to optimize alterF for -- the Const and Identity functors. In general, these rules -- improve performance. The sole exception is that when using -- Identity, deleting a key that is already absent takes longer -- than it would without the rules. If you expect this to occur a very -- large fraction of the time, you might consider using a private copy of -- the Identity type. -- -- Note: alterF is a flipped version of the at combinator -- from At. alterF :: (Functor f, Ord k) => (Maybe a -> f (Maybe a)) -> k -> Map k a -> f (Map k a) -- | O(m*log(n/m + 1)), m <= n. The expression (union -- t1 t2) takes the left-biased union of t1 and -- t2. It prefers t1 when duplicate keys are -- encountered, i.e. (union == unionWith -- const). -- --
-- union (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "a"), (7, "C")] --union :: Ord k => Map k a -> Map k a -> Map k a -- | O(m*log(n/m + 1)), m <= n. Union with a combining function. -- --
-- unionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "aA"), (7, "C")] --unionWith :: Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a -- | O(m*log(n/m + 1)), m <= n. Union with a combining function. -- --
-- 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")] --unionWithKey :: Ord k => (k -> a -> a -> a) -> Map k a -> Map k a -> Map k a -- | The union of a list of maps: (unions == foldl -- union empty). -- --
-- 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")] --unions :: Ord k => [Map k a] -> Map k a -- | The union of a list of maps, with a combining operation: -- (unionsWith f == foldl (unionWith f) -- empty). -- --
-- unionsWith (++) [(fromList [(5, "a"), (3, "b")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "A3"), (3, "B3")])] -- == fromList [(3, "bB3"), (5, "aAA3"), (7, "C")] --unionsWith :: Ord k => (a -> a -> a) -> [Map k a] -> Map k a -- | O(m*log(n/m + 1)), m <= n. Difference of two maps. Return -- elements of the first map not existing in the second map. -- --
-- difference (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 3 "b" --difference :: Ord k => Map k a -> Map k b -> Map k a -- | O(n+m). Difference with a combining function. When two equal -- keys are encountered, the combining function is applied to the values -- of these keys. If it returns Nothing, the element is discarded -- (proper set difference). If it returns (Just y), the -- element is updated with a new value y. -- --
-- 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" --differenceWith :: Ord k => (a -> b -> Maybe a) -> Map k a -> Map k b -> Map k a -- | O(n+m). Difference with a combining function. When two equal -- keys are encountered, the combining function is applied to the key and -- both values. If it returns Nothing, the element is discarded -- (proper set difference). If it returns (Just y), the -- element is updated with a new value y. -- --
-- 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" --differenceWithKey :: Ord k => (k -> a -> b -> Maybe a) -> Map k a -> Map k b -> Map k a -- | O(m*log(n/m + 1)), m <= n. Intersection of two maps. Return -- data in the first map for the keys existing in both maps. -- (intersection m1 m2 == intersectionWith const -- m1 m2). -- --
-- intersection (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "a" --intersection :: Ord k => Map k a -> Map k b -> Map k a -- | O(m*log(n/m + 1)), m <= n. Intersection with a combining -- function. -- --
-- intersectionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "aA" --intersectionWith :: Ord k => (a -> b -> c) -> Map k a -> Map k b -> Map k c -- | O(m*log(n/m + 1)), m <= n. Intersection with a combining -- function. -- --
-- 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" --intersectionWithKey :: Ord k => (k -> a -> b -> c) -> Map k a -> Map k b -> Map k c -- | O(n+m). An unsafe universal combining function. -- -- WARNING: This function can produce corrupt maps and its results may -- depend on the internal structures of its inputs. Users should prefer -- merge or mergeA. -- -- When mergeWithKey is given three arguments, it is inlined to -- the call site. You should therefore use mergeWithKey only to -- define 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 mergeWithKey combine only1 only2, a -- function combining two Maps is created, such that -- --
-- map (++ "x") (fromList [(5,"a"), (3,"b")]) == fromList [(3, "bx"), (5, "ax")] --map :: (a -> b) -> Map k a -> Map k b -- | O(n). Map a function over all values in the map. -- --
-- let f key x = (show key) ++ ":" ++ x -- mapWithKey f (fromList [(5,"a"), (3,"b")]) == fromList [(3, "3:b"), (5, "5:a")] --mapWithKey :: (k -> a -> b) -> Map k a -> Map k b -- | O(n). traverseWithKey f m == fromList -- $ traverse ((k, v) -> (v' -> v' seq (k,v')) -- $ f k v) (toList m) That is, it behaves much like a -- regular traverse except that the traversing function also has -- access to the key associated with a value and the values are forced -- before they are installed in the result map. -- --
-- 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 --traverseWithKey :: Applicative t => (k -> a -> t b) -> Map k a -> t (Map k b) -- | O(n). Traverse keys/values and collect the Just results. traverseMaybeWithKey :: Applicative f => (k -> a -> f (Maybe b)) -> Map k a -> f (Map k b) -- | O(n). The function mapAccum threads an accumulating -- argument through the map in ascending order of keys. -- --
-- let f a b = (a ++ b, b ++ "X")
-- mapAccum f "Everything: " (fromList [(5,"a"), (3,"b")]) == ("Everything: ba", fromList [(3, "bX"), (5, "aX")])
--
mapAccum :: (a -> b -> (a, c)) -> a -> Map k b -> (a, Map k c)
-- | O(n). The function mapAccumWithKey threads an
-- accumulating argument through the map in ascending order of keys.
--
--
-- 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")])
--
mapAccumWithKey :: (a -> k -> b -> (a, c)) -> a -> Map k b -> (a, Map k c)
-- | O(n). The function mapAccumR threads an accumulating
-- argument through the map in descending order of keys.
mapAccumRWithKey :: (a -> k -> b -> (a, c)) -> a -> Map k b -> (a, Map k c)
-- | O(n*log n). mapKeys f s is the map obtained by
-- applying f 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" --mapKeys :: Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a -- | O(n*log n). mapKeysWith c f s is the map -- obtained by applying f 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" --mapKeysWith :: Ord k2 => (a -> a -> a) -> (k1 -> k2) -> Map k1 a -> Map k2 a -- | O(n). mapKeysMonotonic f s == mapKeys f -- s, but works only when f 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 better performance than -- mapKeys. -- --
-- mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")]) == fromList [(6, "b"), (10, "a")] -- valid (mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")])) == True -- valid (mapKeysMonotonic (\ _ -> 1) (fromList [(5,"a"), (3,"b")])) == False --mapKeysMonotonic :: (k1 -> k2) -> Map k1 a -> Map k2 a -- | O(n). Fold the values in the map using the given -- right-associative binary operator, such that foldr f z == -- foldr f z . elems. -- -- For example, -- --
-- elems map = foldr (:) [] map ---- --
-- let f a len = len + (length a) -- foldr f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldr :: (a -> b -> b) -> b -> Map k a -> b -- | O(n). Fold the values in the map using the given -- left-associative binary operator, such that foldl f z == -- foldl f z . elems. -- -- For example, -- --
-- elems = reverse . foldl (flip (:)) [] ---- --
-- let f len a = len + (length a) -- foldl f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldl :: (a -> b -> a) -> a -> Map k b -> a -- | O(n). Fold the keys and values in the map using the given -- right-associative binary operator, such that 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)"
--
foldrWithKey :: (k -> a -> b -> b) -> b -> Map k a -> b
-- | O(n). Fold the keys and values in the map using the given
-- left-associative binary operator, such that 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)"
--
foldlWithKey :: (a -> k -> b -> a) -> a -> Map k b -> a
-- | O(n). Fold the keys and values in the map using the given
-- monoid, such that
--
-- -- foldMapWithKey f = fold . mapWithKey f ---- -- This can be an asymptotically faster than foldrWithKey or -- foldlWithKey for some monoids. foldMapWithKey :: Monoid m => (k -> a -> m) -> Map k a -> m -- | O(n). A strict version of foldr. Each application of the -- operator is evaluated before using the result in the next application. -- This function is strict in the starting value. foldr' :: (a -> b -> b) -> b -> Map k a -> b -- | O(n). A strict version of foldl. 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 -> Map k b -> a -- | O(n). A strict version of foldrWithKey. Each application -- of the operator is evaluated before using the result in the next -- application. This function is strict in the starting value. foldrWithKey' :: (k -> a -> b -> b) -> b -> Map k a -> b -- | O(n). A strict version of foldlWithKey. 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 -> k -> b -> a) -> a -> Map k b -> a -- | O(n). Return all elements of the map in the ascending order of -- their keys. Subject to list fusion. -- --
-- elems (fromList [(5,"a"), (3,"b")]) == ["b","a"] -- elems empty == [] --elems :: Map k a -> [a] -- | O(n). Return all keys of the map in ascending order. Subject to -- list fusion. -- --
-- keys (fromList [(5,"a"), (3,"b")]) == [3,5] -- keys empty == [] --keys :: Map k a -> [k] -- | O(n). An alias for toAscList. Return 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 == [] --assocs :: Map k a -> [(k, a)] -- | O(n). The set of all keys of the map. -- --
-- keysSet (fromList [(5,"a"), (3,"b")]) == Data.Set.fromList [3,5] -- keysSet empty == Data.Set.empty --keysSet :: Map k a -> Set k -- | O(n). Build a map from a set of keys and a function which for -- each key computes its value. -- --
-- fromSet (\k -> replicate k 'a') (Data.Set.fromList [3, 5]) == fromList [(5,"aaaaa"), (3,"aaa")] -- fromSet undefined Data.Set.empty == empty --fromSet :: (k -> a) -> Set k -> Map k a -- | O(n). Convert the map to a list of key/value pairs. Subject to -- list fusion. -- --
-- toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] -- toList empty == [] --toList :: Map k a -> [(k, a)] -- | O(n*log n). Build a map from a list of key/value pairs. See -- also fromAscList. If the list contains more than one value for -- the same key, the last value for the key is retained. -- -- If the keys of the list are ordered, linear-time implementation is -- used, with the performance equal to fromDistinctAscList. -- --
-- 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")] --fromList :: Ord k => [(k, a)] -> Map k a -- | O(n*log n). Build a map from a list of key/value pairs with a -- combining function. See also fromAscListWith. -- --
-- fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")] -- fromListWith (++) [] == empty --fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a -- | O(n*log n). Build a map from a list of key/value pairs with a -- combining function. See also fromAscListWithKey. -- --
-- let f k a1 a2 = (show k) ++ a1 ++ a2 -- fromListWithKey f [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "3ab"), (5, "5a5ba")] -- fromListWithKey f [] == empty --fromListWithKey :: Ord k => (k -> a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in ascending order. Subject to list fusion. -- --
-- toAscList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] --toAscList :: Map k a -> [(k, a)] -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in descending order. Subject to list fusion. -- --
-- toDescList (fromList [(5,"a"), (3,"b")]) == [(5,"a"), (3,"b")] --toDescList :: Map k a -> [(k, a)] -- | O(n). Build a map from an ascending list in linear time. The -- precondition (input list is ascending) is not checked. -- --
-- fromAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] -- fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")] -- valid (fromAscList [(3,"b"), (5,"a"), (5,"b")]) == True -- valid (fromAscList [(5,"a"), (3,"b"), (5,"b")]) == False --fromAscList :: Eq k => [(k, a)] -> Map k a -- | O(n). Build a map from an ascending list in linear time with a -- combining function for equal keys. The precondition (input list is -- ascending) is not checked. -- --
-- fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")] -- valid (fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")]) == True -- valid (fromAscListWith (++) [(5,"a"), (3,"b"), (5,"b")]) == False --fromAscListWith :: Eq k => (a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from an ascending list in linear time with a -- combining function for equal keys. The precondition (input list is -- ascending) is not checked. -- --
-- let f k a1 a2 = (show k) ++ ":" ++ a1 ++ a2 -- fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")] == fromList [(3, "b"), (5, "5:b5:ba")] -- valid (fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")]) == True -- valid (fromAscListWithKey f [(5,"a"), (3,"b"), (5,"b"), (5,"b")]) == False --fromAscListWithKey :: Eq k => (k -> a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from an ascending list of distinct elements -- in linear time. The precondition is not checked. -- --
-- fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] -- valid (fromDistinctAscList [(3,"b"), (5,"a")]) == True -- valid (fromDistinctAscList [(3,"b"), (5,"a"), (5,"b")]) == False --fromDistinctAscList :: [(k, a)] -> Map k a -- | O(n). Build a map from a descending list in linear time. The -- precondition (input list is descending) is not checked. -- --
-- fromDescList [(5,"a"), (3,"b")] == fromList [(3, "b"), (5, "a")] -- fromDescList [(5,"a"), (5,"b"), (3,"a")] == fromList [(3, "b"), (5, "b")] -- valid (fromDescList [(5,"a"), (5,"b"), (3,"b")]) == True -- valid (fromDescList [(5,"a"), (3,"b"), (5,"b")]) == False --fromDescList :: Eq k => [(k, a)] -> Map k a -- | O(n). Build a map from a descending list in linear time with a -- combining function for equal keys. The precondition (input list is -- descending) is not checked. -- --
-- fromDescListWith (++) [(5,"a"), (5,"b"), (3,"b")] == fromList [(3, "b"), (5, "ba")] -- valid (fromDescListWith (++) [(5,"a"), (5,"b"), (3,"b")]) == True -- valid (fromDescListWith (++) [(5,"a"), (3,"b"), (5,"b")]) == False --fromDescListWith :: Eq k => (a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from a descending list in linear time with a -- combining function for equal keys. The precondition (input list is -- descending) is not checked. -- --
-- let f k a1 a2 = (show k) ++ ":" ++ a1 ++ a2 -- fromDescListWithKey f [(5,"a"), (5,"b"), (5,"b"), (3,"b")] == fromList [(3, "b"), (5, "5:b5:ba")] -- valid (fromDescListWithKey f [(5,"a"), (5,"b"), (5,"b"), (3,"b")]) == True -- valid (fromDescListWithKey f [(5,"a"), (3,"b"), (5,"b"), (5,"b")]) == False --fromDescListWithKey :: Eq k => (k -> a -> a -> a) -> [(k, a)] -> Map k a -- | O(n). Build a map from a descending list of distinct elements -- in linear time. The precondition is not checked. -- --
-- fromDistinctDescList [(5,"a"), (3,"b")] == fromList [(3, "b"), (5, "a")] -- valid (fromDistinctDescList [(5,"a"), (3,"b")]) == True -- valid (fromDistinctDescList [(5,"a"), (3,"b"), (3,"a")]) == False --fromDistinctDescList :: [(k, a)] -> Map k a -- | O(n). Filter all values that satisfy the predicate. -- --
-- 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 --filter :: (a -> Bool) -> Map k a -> Map k a -- | O(n). Filter all keys/values that satisfy the predicate. -- --
-- filterWithKey (\k _ -> k > 4) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" --filterWithKey :: (k -> a -> Bool) -> Map k a -> Map k a -- | O(m*log(nm + 1)), m <= n/. Restrict a Map to only -- those keys found in a Set. -- --
-- m restrictKeys s = filterWithKey (k _ -> k `member' s) m --restrictKeys :: Ord k => Map k a -> Set k -> Map k a -- | O(m*log(nm + 1)), m <= n/. Remove all keys in a Set -- from a Map. -- --
-- m withoutKeys s = filterWithKey (k _ -> k `notMember' s) m --withoutKeys :: Ord k => Map k a -> Set k -> Map k a -- | O(n). Partition the map according to a predicate. The first map -- contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partition :: (a -> Bool) -> Map k a -> (Map k a, Map k a) -- | O(n). Partition the map according to a predicate. The first map -- contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partitionWithKey :: (k -> a -> Bool) -> Map k a -> (Map k a, Map k a) -- | O(log n). Take while a predicate on the keys holds. The user is -- responsible for ensuring that for all keys j and k -- in the map, j < k ==> p j >= p k. See note at -- spanAntitone. -- --
-- takeWhileAntitone p = fromDistinctAscList . takeWhile (p . fst) . toList -- takeWhileAntitone p = filterWithKey (k _ -> p k) --takeWhileAntitone :: (k -> Bool) -> Map k a -> Map k a -- | O(log n). Drop while a predicate on the keys holds. The user is -- responsible for ensuring that for all keys j and k -- in the map, j < k ==> p j >= p k. See note at -- spanAntitone. -- --
-- dropWhileAntitone p = fromDistinctAscList . dropWhile (p . fst) . toList -- dropWhileAntitone p = filterWithKey (k -> not (p k)) --dropWhileAntitone :: (k -> Bool) -> Map k a -> Map k a -- | O(log n). Divide a map at the point where a predicate on the -- keys stops holding. The user is responsible for ensuring that for all -- keys j and k in the map, j < k ==> p j -- >= p k. -- --
-- spanAntitone p xs = (takeWhileAntitone p xs, dropWhileAntitone p xs) -- spanAntitone p xs = partition p xs ---- -- Note: if p is not actually antitone, then -- spanAntitone will split the map at some unspecified -- point where the predicate switches from holding to not holding (where -- the predicate is seen to hold before the first key and to fail after -- the last key). spanAntitone :: (k -> Bool) -> Map k a -> (Map k a, Map k a) -- | O(n). Map values and collect the 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" --mapMaybe :: (a -> Maybe b) -> Map k a -> Map k b -- | O(n). Map keys/values and collect the 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"
--
mapMaybeWithKey :: (k -> a -> Maybe b) -> Map k a -> Map k b
-- | O(n). Map values and separate the 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")]) --mapEither :: (a -> Either b c) -> Map k a -> (Map k b, Map k c) -- | O(n). Map keys/values and separate the 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")]) --mapEitherWithKey :: (k -> a -> Either b c) -> Map k a -> (Map k b, Map k c) -- | O(log n). The expression (split k map) is a -- pair (map1,map2) where the keys in map1 are smaller -- than k and the 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) --split :: Ord k => k -> Map k a -> (Map k a, Map k a) -- | O(log n). The expression (splitLookup k map) -- splits a map just like split but also returns lookup -- k 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) --splitLookup :: Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a) -- | O(1). Decompose a map into pieces based on the structure of the -- underlying tree. This function is useful for consuming a map in -- parallel. -- -- 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] ['a'..])) == -- [fromList [(1,'a'),(2,'b'),(3,'c')],fromList [(4,'d')],fromList [(5,'e'),(6,'f')]] ---- --
-- splitRoot empty == [] ---- -- Note that the current implementation does not return more than three -- submaps, but you should not depend on this behaviour because it can -- change in the future without notice. splitRoot :: Map k b -> [Map k b] -- | O(m*log(nm + 1)), m <= n/. This function is defined as -- (isSubmapOf = isSubmapOfBy (==)). isSubmapOf :: (Ord k, Eq a) => Map k a -> Map k a -> Bool -- | O(m*log(nm + 1)), m <= n/. The expression -- (isSubmapOfBy f t1 t2) returns True if all keys -- in t1 are in tree t2, and when f returns -- True when applied to their respective values. For example, the -- following expressions are all True: -- --
-- isSubmapOfBy (==) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (<=) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (==) (fromList [('a',1),('b',2)]) (fromList [('a',1),('b',2)])
--
--
-- But the following are all False:
--
--
-- isSubmapOfBy (==) (fromList [('a',2)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (<) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
-- isSubmapOfBy (==) (fromList [('a',1),('b',2)]) (fromList [('a',1)])
--
isSubmapOfBy :: Ord k => (a -> b -> Bool) -> Map k a -> Map k b -> Bool
-- | O(m*log(nm + 1)), m <= n/. Is this a proper submap? (ie. a
-- submap but not equal). Defined as (isProperSubmapOf =
-- isProperSubmapOfBy (==)).
isProperSubmapOf :: (Ord k, Eq a) => Map k a -> Map k a -> Bool
-- | O(m*log(nm + 1)), m <= n/. Is this a proper submap? (ie. a
-- submap but not equal). The expression (isProperSubmapOfBy f
-- m1 m2) returns True when m1 and 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)]) --isProperSubmapOfBy :: Ord k => (a -> b -> Bool) -> Map k a -> Map k b -> Bool -- | O(log n). Lookup the index of a key, which is its -- zero-based index in the sequence sorted by keys. The index is a number -- from 0 up to, but not including, the size of the map. -- --
-- isJust (lookupIndex 2 (fromList [(5,"a"), (3,"b")])) == False -- fromJust (lookupIndex 3 (fromList [(5,"a"), (3,"b")])) == 0 -- fromJust (lookupIndex 5 (fromList [(5,"a"), (3,"b")])) == 1 -- isJust (lookupIndex 6 (fromList [(5,"a"), (3,"b")])) == False --lookupIndex :: Ord k => k -> Map k a -> Maybe Int -- | O(log n). Return the index of a key, which is its -- zero-based index in the sequence sorted by keys. The index is a number -- from 0 up to, but not including, the size of the map. -- Calls error when the key is not a member of the map. -- --
-- findIndex 2 (fromList [(5,"a"), (3,"b")]) Error: element is not in the map -- findIndex 3 (fromList [(5,"a"), (3,"b")]) == 0 -- findIndex 5 (fromList [(5,"a"), (3,"b")]) == 1 -- findIndex 6 (fromList [(5,"a"), (3,"b")]) Error: element is not in the map --findIndex :: Ord k => k -> Map k a -> Int -- | O(log n). Retrieve an element by its index, i.e. by its -- zero-based index in the sequence sorted by keys. If the index -- is out of range (less than zero, greater or equal to size of -- the map), error is called. -- --
-- elemAt 0 (fromList [(5,"a"), (3,"b")]) == (3,"b") -- elemAt 1 (fromList [(5,"a"), (3,"b")]) == (5, "a") -- elemAt 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range --elemAt :: Int -> Map k a -> (k, a) -- | O(log n). Update the element at index. Calls -- error when an invalid index is used. -- --
-- updateAt (\ _ _ -> Just "x") 0 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "x"), (5, "a")] -- updateAt (\ _ _ -> Just "x") 1 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "x")] -- updateAt (\ _ _ -> Just "x") 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range -- updateAt (\ _ _ -> Just "x") (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range -- updateAt (\_ _ -> Nothing) 0 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" -- updateAt (\_ _ -> Nothing) 1 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" -- updateAt (\_ _ -> Nothing) 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range -- updateAt (\_ _ -> Nothing) (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range --updateAt :: (k -> a -> Maybe a) -> Int -> Map k a -> Map k a -- | O(log n). Delete the element at index, i.e. by its -- zero-based index in the sequence sorted by keys. If the index -- is out of range (less than zero, greater or equal to size of -- the map), error is called. -- --
-- deleteAt 0 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" -- deleteAt 1 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b" -- deleteAt 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range -- deleteAt (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range --deleteAt :: Int -> Map k a -> Map k a -- | Take a given number of entries in key order, beginning with the -- smallest keys. -- --
-- take n = fromDistinctAscList . take n . toAscList --take :: Int -> Map k a -> Map k a -- | Drop a given number of entries in key order, beginning with the -- smallest keys. -- --
-- drop n = fromDistinctAscList . drop n . toAscList --drop :: Int -> Map k a -> Map k a -- | O(log n). Split a map at a particular index. -- --
-- splitAt !n !xs = (take n xs, drop n xs) --splitAt :: Int -> Map k a -> (Map k a, Map k a) -- | O(log n). The minimal key of the map. Calls error if the -- map is empty. -- --
-- findMin (fromList [(5,"a"), (3,"b")]) == (3,"b") -- findMin empty Error: empty map has no minimal element --findMin :: Map k a -> (k, a) -- | O(log n). The maximal key of the map. Calls error if the -- map is empty. -- --
-- findMax (fromList [(5,"a"), (3,"b")]) == (5,"a") -- findMax empty Error: empty map has no maximal element --findMax :: Map k a -> (k, a) -- | O(log n). Delete the minimal key. Returns an empty map if the -- map is empty. -- --
-- deleteMin (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(5,"a"), (7,"c")] -- deleteMin empty == empty --deleteMin :: Map k a -> Map k a -- | O(log n). Delete the maximal key. Returns an empty map if the -- map is empty. -- --
-- deleteMax (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(3,"b"), (5,"a")] -- deleteMax empty == empty --deleteMax :: Map k a -> Map k a -- | O(log n). Delete and find the minimal element. -- --
-- deleteFindMin (fromList [(5,"a"), (3,"b"), (10,"c")]) == ((3,"b"), fromList[(5,"a"), (10,"c")]) -- deleteFindMin Error: can not return the minimal element of an empty map --deleteFindMin :: Map k a -> ((k, a), Map k a) -- | O(log n). Delete and find the maximal element. -- --
-- deleteFindMax (fromList [(5,"a"), (3,"b"), (10,"c")]) == ((10,"c"), fromList [(3,"b"), (5,"a")]) -- deleteFindMax empty Error: can not return the maximal element of an empty map --deleteFindMax :: Map k a -> ((k, a), Map k a) -- | O(log n). Update the value at the minimal key. -- --
-- 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"
--
updateMin :: (a -> Maybe a) -> Map k a -> Map k a
-- | O(log n). Update the value at the maximal key.
--
--
-- 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"
--
updateMax :: (a -> Maybe a) -> Map k a -> Map k a
-- | O(log n). Update the value at the minimal key.
--
-- -- 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" --updateMinWithKey :: (k -> a -> Maybe a) -> Map k a -> Map k a -- | O(log n). Update the value at the maximal key. -- --
-- 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" --updateMaxWithKey :: (k -> a -> Maybe a) -> Map k a -> Map k a -- | O(log n). Retrieves the value associated with minimal key of -- the map, and the map stripped of that element, or Nothing if -- passed an empty map. -- --
-- minView (fromList [(5,"a"), (3,"b")]) == Just ("b", singleton 5 "a")
-- minView empty == Nothing
--
minView :: Map k a -> Maybe (a, Map k a)
-- | O(log n). Retrieves the value associated with maximal key of
-- the map, and the map stripped of that element, or Nothing if
-- passed an empty map.
--
--
-- maxView (fromList [(5,"a"), (3,"b")]) == Just ("a", singleton 3 "b")
-- maxView empty == Nothing
--
maxView :: Map k a -> Maybe (a, Map k a)
-- | O(log n). Retrieves the minimal (key,value) pair of the map,
-- and the map stripped of that element, or Nothing if passed an
-- empty map.
--
-- -- minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a") -- minViewWithKey empty == Nothing --minViewWithKey :: Map k a -> Maybe ((k, a), Map k a) -- | O(log n). Retrieves the maximal (key,value) pair of the map, -- and the map stripped of that element, or Nothing if passed an -- empty map. -- --
-- maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b") -- maxViewWithKey empty == Nothing --maxViewWithKey :: Map k a -> Maybe ((k, a), Map k a) -- | O(n). Show the tree that implements the map. The tree is shown -- in a compressed, hanging format. See showTreeWith. -- | Deprecated: This function is being removed from the public API. showTree :: (Show k, Show a) => Map k a -> String -- | O(n). The expression (showTreeWith showelem hang -- wide map) shows the tree that implements the map. Elements are -- shown using the showElem function. If hang is -- True, a hanging tree is shown otherwise a rotated tree -- is shown. If wide is True, an extra wide version is -- shown. -- --
-- Map> let t = fromDistinctAscList [(x,()) | x <- [1..5]] -- Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True False t -- (4,()) -- +--(2,()) -- | +--(1,()) -- | +--(3,()) -- +--(5,()) -- -- Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True True t -- (4,()) -- | -- +--(2,()) -- | | -- | +--(1,()) -- | | -- | +--(3,()) -- | -- +--(5,()) -- -- Map> putStrLn $ showTreeWith (\k x -> show (k,x)) False True t -- +--(5,()) -- | -- (4,()) -- | -- | +--(3,()) -- | | -- +--(2,()) -- | -- +--(1,()) ---- | Deprecated: This function is being removed from the public API. showTreeWith :: (k -> a -> String) -> Bool -> Bool -> Map k a -> String -- | O(n). Test if the internal map structure is valid. -- --
-- valid (fromAscList [(3,"b"), (5,"a")]) == True -- valid (fromAscList [(5,"a"), (3,"b")]) == False --valid :: Ord k => Map k a -> Bool -- | This module defines an API for writing functions that merge two maps. -- The key functions are merge and mergeA. Each of these -- can be used with several different "merge tactics". -- -- The merge and mergeA functions are shared by the lazy -- and strict modules. Only the choice of merge tactics determines -- strictness. If you use mapMissing from this module then the -- results will be forced before they are inserted. If you use -- mapMissing from Data.Map.Lazy.Merge then they will not. -- --
-- 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, -- --
-- 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) --merge :: Ord k => SimpleWhenMissing k a c -> SimpleWhenMissing k b c -> SimpleWhenMatched k a b c -> Map k a -> Map k b -> Map k c -- | 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 :: (k -> x -> y -> Maybe z) -- -> SimpleWhenMatched k x y z --zipWithMaybeMatched :: Applicative f => (k -> x -> y -> Maybe z) -> WhenMatched f k x y z -- | 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 :: (k -> x -> y -> z) -- -> SimpleWhenMatched k x y z --zipWithMatched :: Applicative f => (k -> x -> y -> z) -> WhenMatched f k x y z -- | 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 :: (k -> x -> Maybe y) -> SimpleWhenMissing k x y ---- --
-- mapMaybeMissing f = traverseMaybeMissing (\k x -> pure (f k x)) ---- -- but mapMaybeMissing uses fewer unnecessary Applicative -- operations. mapMaybeMissing :: Applicative f => (k -> x -> Maybe y) -> WhenMissing f k x y -- | Drop all the entries whose keys are missing from the other map. -- --
-- dropMissing :: SimpleWhenMissing k x y ---- --
-- dropMissing = mapMaybeMissing (\_ _ -> Nothing) ---- -- but dropMissing is much faster. dropMissing :: Applicative f => WhenMissing f k x y -- | Preserve, unchanged, the entries whose keys are missing from the other -- map. -- --
-- preserveMissing :: SimpleWhenMissing k x x ---- --
-- preserveMissing = Lazy.Merge.mapMaybeMissing (\_ x -> Just x) ---- -- but preserveMissing is much faster. preserveMissing :: Applicative f => WhenMissing f k x x -- | Map over the entries whose keys are missing from the other map. -- --
-- mapMissing :: (k -> x -> y) -> SimpleWhenMissing k x y ---- --
-- mapMissing f = mapMaybeMissing (\k x -> Just $ f k x) ---- -- but mapMissing is somewhat faster. mapMissing :: Applicative f => (k -> x -> y) -> WhenMissing f k x y -- | Filter the entries whose keys are missing from the other map. -- --
-- filterMissing :: (k -> x -> Bool) -> SimpleWhenMissing k x x ---- --
-- filterMissing f = Lazy.Merge.mapMaybeMissing $ \k x -> guard (f k x) *> Just x ---- -- but this should be a little faster. filterMissing :: Applicative f => (k -> x -> Bool) -> WhenMissing f k x x -- | 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 k -> x -> f (Maybe z) -- . data WhenMissing f k x y -- | A tactic for dealing with keys present in both maps in merge or -- mergeA. -- -- A tactic of type WhenMatched f k x y z is an abstract -- representation of a function of type k -> x -> y -> f -- (Maybe z) . data WhenMatched f k x y z -- | 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, -- --
-- filterAMissing f = Lazy.Merge.traverseMaybeMissing $ -- k x -> (b -> guard b *> Just x) $ f k x ---- -- but this should be a little faster. filterAMissing :: Applicative f => (k -> x -> f Bool) -> WhenMissing f k x x -- | Map covariantly over a WhenMissing f k x. mapWhenMissing :: Functor f => (a -> b) -> WhenMissing f k x a -> WhenMissing f k x b -- | Map covariantly over a WhenMatched f k x y. mapWhenMatched :: Functor f => (a -> b) -> WhenMatched f k x y a -> WhenMatched f k x y b -- | Along with zipWithMaybeAMatched, witnesses the isomorphism between -- WhenMatched f k x y z and k -> x -> y -> f -- (Maybe z). runWhenMatched :: WhenMatched f k x y z -> k -> x -> y -> f (Maybe z) -- | Along with traverseMaybeMissing, witnesses the isomorphism between -- WhenMissing f k x y and k -> x -> f (Maybe y). runWhenMissing :: WhenMissing f k x y -> k -> x -> f (Maybe y) -- | Note: You should use Data.Map.Strict instead of this -- module if: -- --
-- import qualified Data.Map as Map ---- -- The implementation of Map is based on size balanced -- binary trees (or trees of bounded balance) as described by: -- --
-- insertWith' (+) k 1 m ---- | Deprecated: As of version 0.5, replaced by insertWith. insertWith' :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a -- | O(log n). Same as insertWithKey, but the value being -- inserted to the map is evaluated to WHNF beforehand. -- | Deprecated: As of version 0.5, replaced by -- insertWithKey. insertWithKey' :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a -- | O(log n). Same as insertLookupWithKey, but the value -- being inserted to the map is evaluated to WHNF beforehand. -- | Deprecated: As of version 0.5, replaced by -- insertLookupWithKey. insertLookupWithKey' :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a) -- | O(n). Fold the values in the map using the given -- right-associative binary operator. This function is an equivalent of -- foldr and is present for compatibility only. -- | Deprecated: As of version 0.5, replaced by foldr. fold :: (a -> b -> b) -> b -> Map k a -> b -- | O(n). Fold the keys and values in the map using the given -- right-associative binary operator. This function is an equivalent of -- foldrWithKey and is present for compatibility only. -- | Deprecated: As of version 0.4, replaced by foldrWithKey. foldWithKey :: (k -> a -> b -> b) -> b -> Map k a -> b -- | An efficient implementation of integer sets. -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import Data.IntSet (IntSet) -- import qualified Data.IntSet as IntSet ---- -- The implementation is based on big-endian patricia trees. This -- data structure performs especially well on binary operations like -- union and intersection. However, my benchmarks show that -- it is also (much) faster on insertions and deletions when compared to -- a generic size-balanced set implementation (see Data.Set). -- --
-- lookupLT 3 (fromList [3, 5]) == Nothing -- lookupLT 5 (fromList [3, 5]) == Just 3 --lookupLT :: Key -> IntSet -> Maybe Key -- | O(log n). Find smallest element greater than the given one. -- --
-- lookupGT 4 (fromList [3, 5]) == Just 5 -- lookupGT 5 (fromList [3, 5]) == Nothing --lookupGT :: Key -> IntSet -> Maybe Key -- | O(log n). Find largest element smaller or equal to the given -- one. -- --
-- lookupLE 2 (fromList [3, 5]) == Nothing -- lookupLE 4 (fromList [3, 5]) == Just 3 -- lookupLE 5 (fromList [3, 5]) == Just 5 --lookupLE :: Key -> IntSet -> Maybe Key -- | O(log n). Find smallest element greater or equal to the given -- one. -- --
-- lookupGE 3 (fromList [3, 5]) == Just 3 -- lookupGE 4 (fromList [3, 5]) == Just 5 -- lookupGE 6 (fromList [3, 5]) == Nothing --lookupGE :: Key -> IntSet -> Maybe Key -- | O(n+m). Is this a subset? (s1 isSubsetOf s2) -- tells whether s1 is a subset of s2. isSubsetOf :: IntSet -> IntSet -> Bool -- | O(n+m). Is this a proper subset? (ie. a subset but not equal). isProperSubsetOf :: IntSet -> IntSet -> Bool -- | O(1). The empty set. empty :: IntSet -- | O(1). A set of one element. singleton :: Key -> IntSet -- | O(min(n,W)). Add a value to the set. There is no left- or right -- bias for IntSets. insert :: Key -> IntSet -> IntSet -- | O(min(n,W)). Delete a value in the set. Returns the original -- set when the value was not present. delete :: Key -> IntSet -> IntSet -- | O(n+m). The union of two sets. union :: IntSet -> IntSet -> IntSet -- | The union of a list of sets. unions :: [IntSet] -> IntSet -- | O(n+m). Difference between two sets. difference :: IntSet -> IntSet -> IntSet -- | O(n+m). The intersection of two sets. intersection :: IntSet -> IntSet -> IntSet -- | O(n). Filter all elements that satisfy some predicate. filter :: (Key -> Bool) -> IntSet -> IntSet -- | O(n). partition the set according to some predicate. partition :: (Key -> Bool) -> IntSet -> (IntSet, IntSet) -- | O(min(n,W)). The expression (split x set) is a -- pair (set1,set2) where set1 comprises the elements -- of set less than x and set2 comprises the -- elements of set greater than x. -- --
-- split 3 (fromList [1..5]) == (fromList [1,2], fromList [4,5]) --split :: Key -> IntSet -> (IntSet, IntSet) -- | O(min(n,W)). Performs a split but also returns whether -- the pivot element was found in the original set. splitMember :: Key -> IntSet -> (IntSet, Bool, IntSet) -- | O(1). Decompose a set into pieces based on the structure of the -- underlying tree. This function is useful for consuming a set in -- parallel. -- -- 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 [1..120]) == [fromList [1..63],fromList [64..120]] -- splitRoot empty == [] ---- -- Note that the current implementation does not return more than two -- subsets, but you should not depend on this behaviour because it can -- change in the future without notice. Also, the current version does -- not continue splitting all the way to individual singleton sets -- it -- stops at some point. splitRoot :: IntSet -> [IntSet] -- | O(n*min(n,W)). map f s is the set obtained by -- applying f to each element of s. -- -- It's worth noting that the size of the result may be smaller if, for -- some (x,y), x /= y && f x == f y map :: (Key -> Key) -> IntSet -> IntSet -- | O(n). Fold the elements in the set using the given -- right-associative binary operator, such that foldr f z == -- foldr f z . toAscList. -- -- For example, -- --
-- toAscList set = foldr (:) [] set --foldr :: (Key -> b -> b) -> b -> IntSet -> b -- | O(n). Fold the elements in the set using the given -- left-associative binary operator, such that foldl f z == -- foldl f z . toAscList. -- -- For example, -- --
-- toDescList set = foldl (flip (:)) [] set --foldl :: (a -> Key -> a) -> a -> IntSet -> a -- | O(n). A strict version of foldr. Each application of the -- operator is evaluated before using the result in the next application. -- This function is strict in the starting value. foldr' :: (Key -> b -> b) -> b -> IntSet -> b -- | O(n). A strict version of foldl. 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 -> Key -> a) -> a -> IntSet -> a -- | O(n). Fold the elements in the set using the given -- right-associative binary operator. This function is an equivalent of -- foldr and is present for compatibility only. -- -- Please note that fold will be deprecated in the future and -- removed. fold :: (Key -> b -> b) -> b -> IntSet -> b -- | O(min(n,W)). The minimal element of the set. findMin :: IntSet -> Key -- | O(min(n,W)). The maximal element of a set. findMax :: IntSet -> Key -- | O(min(n,W)). Delete the minimal element. Returns an empty set -- if the set is empty. -- -- Note that this is a change of behaviour for consistency with -- Set – versions prior to 0.5 threw an error if the IntSet -- was already empty. deleteMin :: IntSet -> IntSet -- | O(min(n,W)). Delete the maximal element. Returns an empty set -- if the set is empty. -- -- Note that this is a change of behaviour for consistency with -- Set – versions prior to 0.5 threw an error if the IntSet -- was already empty. deleteMax :: IntSet -> IntSet -- | O(min(n,W)). Delete and find the minimal element. -- --
-- deleteFindMin set = (findMin set, deleteMin set) --deleteFindMin :: IntSet -> (Key, IntSet) -- | O(min(n,W)). Delete and find the maximal element. -- --
-- deleteFindMax set = (findMax set, deleteMax set) --deleteFindMax :: IntSet -> (Key, IntSet) -- | O(min(n,W)). Retrieves the maximal key of the set, and the set -- stripped of that element, or Nothing if passed an empty set. maxView :: IntSet -> Maybe (Key, IntSet) -- | O(min(n,W)). Retrieves the minimal key of the set, and the set -- stripped of that element, or Nothing if passed an empty set. minView :: IntSet -> Maybe (Key, IntSet) -- | O(n). An alias of toAscList. The elements of a set in -- ascending order. Subject to list fusion. elems :: IntSet -> [Key] -- | O(n). Convert the set to a list of elements. Subject to list -- fusion. toList :: IntSet -> [Key] -- | O(n*min(n,W)). Create a set from a list of integers. fromList :: [Key] -> IntSet -- | O(n). Convert the set to an ascending list of elements. Subject -- to list fusion. toAscList :: IntSet -> [Key] -- | O(n). Convert the set to a descending list of elements. Subject -- to list fusion. toDescList :: IntSet -> [Key] -- | O(n). Build a set from an ascending list of elements. The -- precondition (input list is ascending) is not checked. fromAscList :: [Key] -> IntSet -- | O(n). Build a set from an ascending list of distinct elements. -- The precondition (input list is strictly ascending) is not -- checked. fromDistinctAscList :: [Key] -> IntSet -- | O(n). Show the tree that implements the set. The tree is shown -- in a compressed, hanging format. showTree :: IntSet -> String -- | O(n). The expression (showTreeWith hang wide -- map) shows the tree that implements the set. If hang is -- True, a hanging tree is shown otherwise a rotated tree -- is shown. If wide is True, an extra wide version is -- shown. showTreeWith :: Bool -> Bool -> IntSet -> String -- | An efficient implementation of maps from integer keys to values -- (dictionaries). -- -- API of this module is strict in the keys, but lazy in the values. If -- you need value-strict maps, use Data.IntMap.Strict instead. The -- IntMap type itself is shared between the lazy and strict -- modules, meaning that the same IntMap value can be passed to -- functions in both modules (although that is rarely needed). -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import Data.IntMap.Lazy (IntMap) -- import qualified Data.IntMap.Lazy as IntMap ---- -- The implementation is based on big-endian patricia trees. This -- data structure performs especially well on binary operations like -- union and intersection. However, my benchmarks show that -- it is also (much) faster on insertions and deletions when compared to -- a generic size-balanced map implementation (see Data.Map). -- --
-- fromList [(5,'a'), (3,'b')] ! 1 Error: element not in the map -- fromList [(5,'a'), (3,'b')] ! 5 == 'a' --(!) :: IntMap a -> Key -> a -- | Same as difference. (\\) :: IntMap a -> IntMap b -> IntMap a infixl 9 \\ -- | O(1). Is the map empty? -- --
-- Data.IntMap.null (empty) == True -- Data.IntMap.null (singleton 1 'a') == False --null :: IntMap a -> Bool -- | O(n). Number of elements in the map. -- --
-- size empty == 0 -- size (singleton 1 'a') == 1 -- size (fromList([(1,'a'), (2,'c'), (3,'b')])) == 3 --size :: IntMap a -> Int -- | O(min(n,W)). Is the key a member of the map? -- --
-- member 5 (fromList [(5,'a'), (3,'b')]) == True -- member 1 (fromList [(5,'a'), (3,'b')]) == False --member :: Key -> IntMap a -> Bool -- | O(min(n,W)). Is the key not a member of the map? -- --
-- notMember 5 (fromList [(5,'a'), (3,'b')]) == False -- notMember 1 (fromList [(5,'a'), (3,'b')]) == True --notMember :: Key -> IntMap a -> Bool -- | O(min(n,W)). Lookup the value at a key in the map. See also -- lookup. lookup :: Key -> IntMap a -> Maybe a -- | O(min(n,W)). The expression (findWithDefault def k -- map) returns the value at key 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' --findWithDefault :: a -> Key -> IntMap a -> a -- | O(log n). Find largest key smaller than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupLT 3 (fromList [(3,'a'), (5,'b')]) == Nothing -- lookupLT 4 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a') --lookupLT :: Key -> IntMap a -> Maybe (Key, a) -- | O(log n). Find smallest key greater than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupGT 4 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b') -- lookupGT 5 (fromList [(3,'a'), (5,'b')]) == Nothing --lookupGT :: Key -> IntMap a -> Maybe (Key, a) -- | O(log n). Find largest key smaller or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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') --lookupLE :: Key -> IntMap a -> Maybe (Key, a) -- | O(log n). Find smallest key greater or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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 --lookupGE :: Key -> IntMap a -> Maybe (Key, a) -- | O(1). The empty map. -- --
-- empty == fromList [] -- size empty == 0 --empty :: IntMap a -- | O(1). A map of one element. -- --
-- singleton 1 'a' == fromList [(1, 'a')] -- size (singleton 1 'a') == 1 --singleton :: Key -> a -> IntMap a -- | O(min(n,W)). Insert a new key/value pair in the map. If the key -- is already present in the map, the associated value is replaced with -- the supplied value, i.e. 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' --insert :: Key -> a -> IntMap a -> IntMap a -- | O(min(n,W)). Insert with a combining function. -- insertWith f key value mp will insert the pair (key, -- value) into mp 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" --insertWith :: (a -> a -> a) -> Key -> a -> IntMap a -> IntMap a -- | O(min(n,W)). Insert with a combining function. -- insertWithKey f key value mp will insert the pair -- (key, value) into mp 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" --insertWithKey :: (Key -> a -> a -> a) -> Key -> a -> IntMap a -> IntMap a -- | O(min(n,W)). The expression (insertLookupWithKey f k -- x map) is a pair where the first element is equal to -- (lookup k map) and the second element equal to -- (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")]) --insertLookupWithKey :: (Key -> a -> a -> a) -> Key -> a -> IntMap a -> (Maybe a, IntMap a) -- | O(min(n,W)). Delete a key and its value from the map. When the -- key is not a member of the map, the original map is returned. -- --
-- 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 --delete :: Key -> IntMap a -> IntMap a -- | O(min(n,W)). Adjust a value at a specific key. When the key is -- not a member of the map, the original map is returned. -- --
-- 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
--
adjust :: (a -> a) -> Key -> IntMap a -> IntMap a
-- | O(min(n,W)). Adjust a value at a specific key. When the key is
-- not a member of the map, the original map is returned.
--
-- -- 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 --adjustWithKey :: (Key -> a -> a) -> Key -> IntMap a -> IntMap a -- | O(min(n,W)). The expression (update f k map) -- updates the value x at k (if it is in the map). If -- (f x) is Nothing, the element is deleted. If it is -- (Just y), the key k 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" --update :: (a -> Maybe a) -> Key -> IntMap a -> IntMap a -- | O(min(n,W)). The expression (update f k map) -- updates the value x at k (if it is in the map). If -- (f k x) is Nothing, the element is deleted. If it is -- (Just y), the key k 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" --updateWithKey :: (Key -> a -> Maybe a) -> Key -> IntMap a -> IntMap a -- | O(min(n,W)). Lookup and update. The function returns original -- value, if it is updated. This is different behavior than -- 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") --updateLookupWithKey :: (Key -> a -> Maybe a) -> Key -> IntMap a -> (Maybe a, IntMap a) -- | O(min(n,W)). The expression (alter f k map) -- alters the value x at k, or absence thereof. -- alter can be used to insert, delete, or update a value in an -- IntMap. In short : lookup k (alter f k m) = f -- (lookup k m). alter :: (Maybe a -> Maybe a) -> Key -> IntMap a -> IntMap a -- | O(log n). The expression (alterF f k map) -- alters the value x 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 At. alterF :: Functor f => (Maybe a -> f (Maybe a)) -> Key -> IntMap a -> f (IntMap a) -- | O(n+m). The (left-biased) union of two maps. It prefers the -- first map when duplicate keys are encountered, i.e. (union -- == unionWith const). -- --
-- union (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "a"), (7, "C")] --union :: IntMap a -> IntMap a -> IntMap a -- | O(n+m). The union with a combining function. -- --
-- unionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "aA"), (7, "C")] --unionWith :: (a -> a -> a) -> IntMap a -> IntMap a -> IntMap a -- | O(n+m). The union with a combining function. -- --
-- 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")] --unionWithKey :: (Key -> a -> a -> a) -> IntMap a -> IntMap a -> IntMap a -- | 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")] --unions :: [IntMap a] -> IntMap a -- | 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")] --unionsWith :: (a -> a -> a) -> [IntMap a] -> IntMap a -- | O(n+m). Difference between two maps (based on keys). -- --
-- difference (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 3 "b" --difference :: IntMap a -> IntMap b -> IntMap a -- | O(n+m). Difference with a combining function. -- --
-- 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" --differenceWith :: (a -> b -> Maybe a) -> IntMap a -> IntMap b -> IntMap a -- | O(n+m). Difference with a combining function. When two equal -- keys are encountered, the combining function is applied to the key and -- both values. If it returns Nothing, the element is discarded -- (proper set difference). If it returns (Just y), the -- element is updated with a new value y. -- --
-- 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" --differenceWithKey :: (Key -> a -> b -> Maybe a) -> IntMap a -> IntMap b -> IntMap a -- | O(n+m). The (left-biased) intersection of two maps (based on -- keys). -- --
-- intersection (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "a" --intersection :: IntMap a -> IntMap b -> IntMap a -- | O(n+m). The intersection with a combining function. -- --
-- intersectionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "aA" --intersectionWith :: (a -> b -> c) -> IntMap a -> IntMap b -> IntMap c -- | O(n+m). The intersection with a combining function. -- --
-- 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" --intersectionWithKey :: (Key -> a -> b -> c) -> IntMap a -> IntMap b -> IntMap c -- | O(n+m). A high-performance universal combining function. Using -- 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 mergeWithKey combine only1 only2, a -- function combining two IntMaps is created, such that -- --
-- map (++ "x") (fromList [(5,"a"), (3,"b")]) == fromList [(3, "bx"), (5, "ax")] --map :: (a -> b) -> IntMap a -> IntMap b -- | O(n). Map a function over all values in the map. -- --
-- let f key x = (show key) ++ ":" ++ x -- mapWithKey f (fromList [(5,"a"), (3,"b")]) == fromList [(3, "3:b"), (5, "5:a")] --mapWithKey :: (Key -> a -> b) -> IntMap a -> IntMap b -- | O(n). traverseWithKey f s == fromList -- $ traverse ((k, v) -> (,) k $ f k v) -- (toList m) That is, behaves exactly like a regular -- 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 --traverseWithKey :: Applicative t => (Key -> a -> t b) -> IntMap a -> t (IntMap b) -- | O(n). The function mapAccum threads an -- accumulating argument through the map in ascending order of keys. -- --
-- let f a b = (a ++ b, b ++ "X")
-- mapAccum f "Everything: " (fromList [(5,"a"), (3,"b")]) == ("Everything: ba", fromList [(3, "bX"), (5, "aX")])
--
mapAccum :: (a -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c)
-- | O(n). The function mapAccumWithKey threads an
-- accumulating argument through the map in ascending order of keys.
--
--
-- 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")])
--
mapAccumWithKey :: (a -> Key -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c)
-- | O(n). The function mapAccumR threads an
-- accumulating argument through the map in descending order of keys.
mapAccumRWithKey :: (a -> Key -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c)
-- | O(n*min(n,W)). mapKeys f s is the map obtained
-- by applying f 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" --mapKeys :: (Key -> Key) -> IntMap a -> IntMap a -- | O(n*min(n,W)). mapKeysWith c f s is the map -- obtained by applying f 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" --mapKeysWith :: (a -> a -> a) -> (Key -> Key) -> IntMap a -> IntMap a -- | O(n*min(n,W)). mapKeysMonotonic f s == -- mapKeys f s, but works only when f 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")] --mapKeysMonotonic :: (Key -> Key) -> IntMap a -> IntMap a -- | O(n). Fold the values in the map using the given -- right-associative binary operator, such that foldr f z == -- foldr f z . elems. -- -- For example, -- --
-- elems map = foldr (:) [] map ---- --
-- let f a len = len + (length a) -- foldr f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldr :: (a -> b -> b) -> b -> IntMap a -> b -- | O(n). Fold the values in the map using the given -- left-associative binary operator, such that foldl f z == -- foldl f z . elems. -- -- For example, -- --
-- elems = reverse . foldl (flip (:)) [] ---- --
-- let f len a = len + (length a) -- foldl f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldl :: (a -> b -> a) -> a -> IntMap b -> a -- | O(n). Fold the keys and values in the map using the given -- right-associative binary operator, such that 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)"
--
foldrWithKey :: (Key -> a -> b -> b) -> b -> IntMap a -> b
-- | O(n). Fold the keys and values in the map using the given
-- left-associative binary operator, such that 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)"
--
foldlWithKey :: (a -> Key -> b -> a) -> a -> IntMap b -> a
-- | O(n). Fold the keys and values in the map using the given
-- monoid, such that
--
-- -- foldMapWithKey f = fold . mapWithKey f ---- -- This can be an asymptotically faster than foldrWithKey or -- foldlWithKey for some monoids. foldMapWithKey :: Monoid m => (Key -> a -> m) -> IntMap a -> m -- | O(n). A strict version of foldr. Each application of the -- operator is evaluated before using the result in the next application. -- This function is strict in the starting value. foldr' :: (a -> b -> b) -> b -> IntMap a -> b -- | O(n). A strict version of foldl. 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 -- | O(n). A strict version of foldrWithKey. 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 -- | O(n). A strict version of foldlWithKey. 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 -- | O(n). Return all elements of the map in the ascending order of -- their keys. Subject to list fusion. -- --
-- elems (fromList [(5,"a"), (3,"b")]) == ["b","a"] -- elems empty == [] --elems :: IntMap a -> [a] -- | O(n). Return all keys of the map in ascending order. Subject to -- list fusion. -- --
-- keys (fromList [(5,"a"), (3,"b")]) == [3,5] -- keys empty == [] --keys :: IntMap a -> [Key] -- | O(n). An alias for 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 == [] --assocs :: IntMap a -> [(Key, a)] -- | O(n*min(n,W)). The set of all keys of the map. -- --
-- keysSet (fromList [(5,"a"), (3,"b")]) == Data.IntSet.fromList [3,5] -- keysSet empty == Data.IntSet.empty --keysSet :: IntMap a -> IntSet -- | O(n). Build a map from a set of keys and a function which for -- each key computes its value. -- --
-- fromSet (\k -> replicate k 'a') (Data.IntSet.fromList [3, 5]) == fromList [(5,"aaaaa"), (3,"aaa")] -- fromSet undefined Data.IntSet.empty == empty --fromSet :: (Key -> a) -> IntSet -> IntMap a -- | O(n). Convert the map to a list of key/value pairs. Subject to -- list fusion. -- --
-- toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] -- toList empty == [] --toList :: IntMap a -> [(Key, a)] -- | O(n*min(n,W)). Create a map from a list of key/value pairs. -- --
-- 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")] --fromList :: [(Key, a)] -> IntMap a -- | O(n*min(n,W)). Create a map from a list of key/value pairs with -- a combining function. See also fromAscListWith. -- --
-- fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"c")] == fromList [(3, "ab"), (5, "cba")] -- fromListWith (++) [] == empty --fromListWith :: (a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n*min(n,W)). Build a map from a list of key/value pairs with -- a combining function. See also fromAscListWithKey'. -- --
-- 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 --fromListWithKey :: (Key -> a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in ascending order. Subject to list fusion. -- --
-- toAscList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] --toAscList :: IntMap a -> [(Key, a)] -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in descending order. Subject to list fusion. -- --
-- toDescList (fromList [(5,"a"), (3,"b")]) == [(5,"a"), (3,"b")] --toDescList :: IntMap a -> [(Key, a)] -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order. -- --
-- fromAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] -- fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")] --fromAscList :: [(Key, a)] -> IntMap a -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order, with a combining function on equal keys. -- The precondition (input list is ascending) is not checked. -- --
-- fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")] --fromAscListWith :: (a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order, with a combining function on equal keys. -- The precondition (input list is ascending) is not checked. -- --
-- 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")] --fromAscListWithKey :: (Key -> a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order and all distinct. The precondition (input -- list is strictly ascending) is not checked. -- --
-- fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] --fromDistinctAscList :: forall a. [(Key, a)] -> IntMap a -- | O(n). Filter all values that satisfy some predicate. -- --
-- 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 --filter :: (a -> Bool) -> IntMap a -> IntMap a -- | O(n). Filter all keys/values that satisfy some predicate. -- --
-- filterWithKey (\k _ -> k > 4) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" --filterWithKey :: (Key -> a -> Bool) -> IntMap a -> IntMap a -- | O(n+m). The restriction of a map to the keys in a set. -- --
-- m restrictKeys s = filterWithKey (k _ -> k `member' s) m --restrictKeys :: IntMap a -> IntSet -> IntMap a -- | Remove all the keys in a given set from a map. -- --
-- m withoutKeys s = filterWithKey (k _ -> k `notMember' s) m --withoutKeys :: IntMap a -> IntSet -> IntMap a -- | O(n). Partition the map according to some predicate. The first -- map contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partition :: (a -> Bool) -> IntMap a -> (IntMap a, IntMap a) -- | O(n). Partition the map according to some predicate. The first -- map contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partitionWithKey :: (Key -> a -> Bool) -> IntMap a -> (IntMap a, IntMap a) -- | O(n). Map values and collect the 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" --mapMaybe :: (a -> Maybe b) -> IntMap a -> IntMap b -- | O(n). Map keys/values and collect the 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"
--
mapMaybeWithKey :: (Key -> a -> Maybe b) -> IntMap a -> IntMap b
-- | O(n). Map values and separate the 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")]) --mapEither :: (a -> Either b c) -> IntMap a -> (IntMap b, IntMap c) -- | O(n). Map keys/values and separate the 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")]) --mapEitherWithKey :: (Key -> a -> Either b c) -> IntMap a -> (IntMap b, IntMap c) -- | O(min(n,W)). The expression (split k map) is a -- pair (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) --split :: Key -> IntMap a -> (IntMap a, IntMap a) -- | O(min(n,W)). Performs a 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) --splitLookup :: Key -> IntMap a -> (IntMap a, Maybe a, IntMap a) -- | O(1). Decompose a map into pieces based on the structure of the -- underlying tree. This function is useful for consuming a map in -- parallel. -- -- 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. splitRoot :: IntMap a -> [IntMap a] -- | O(n+m). Is this a submap? Defined as (isSubmapOf = -- isSubmapOfBy (==)). isSubmapOf :: Eq a => IntMap a -> IntMap a -> Bool -- | O(n+m). The expression (isSubmapOfBy f m1 m2) -- returns True 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)]) --isSubmapOfBy :: (a -> b -> Bool) -> IntMap a -> IntMap b -> Bool -- | O(n+m). Is this a proper submap? (ie. a submap but not equal). -- Defined as (isProperSubmapOf = isProperSubmapOfBy -- (==)). isProperSubmapOf :: Eq a => IntMap a -> IntMap a -> Bool -- | O(n+m). Is this a proper submap? (ie. a submap but not equal). -- The expression (isProperSubmapOfBy f m1 m2) returns -- True when m1 and 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)]) --isProperSubmapOfBy :: (a -> b -> Bool) -> IntMap a -> IntMap b -> Bool -- | O(min(n,W)). The minimal key of the map. findMin :: IntMap a -> (Key, a) -- | O(min(n,W)). The maximal key of the map. findMax :: IntMap a -> (Key, a) -- | O(min(n,W)). Delete the minimal key. Returns an empty map if -- the map is empty. -- -- Note that this is a change of behaviour for consistency with -- Map – versions prior to 0.5 threw an error if the IntMap -- was already empty. deleteMin :: IntMap a -> IntMap a -- | O(min(n,W)). Delete the maximal key. Returns an empty map if -- the map is empty. -- -- Note that this is a change of behaviour for consistency with -- Map – versions prior to 0.5 threw an error if the IntMap -- was already empty. deleteMax :: IntMap a -> IntMap a -- | O(min(n,W)). Delete and find the minimal element. deleteFindMin :: IntMap a -> ((Key, a), IntMap a) -- | O(min(n,W)). Delete and find the maximal element. deleteFindMax :: IntMap a -> ((Key, a), IntMap a) -- | O(min(n,W)). Update the value at the minimal key. -- --
-- 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"
--
updateMin :: (a -> Maybe a) -> IntMap a -> IntMap a
-- | O(min(n,W)). Update the value at the maximal key.
--
--
-- 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"
--
updateMax :: (a -> Maybe a) -> IntMap a -> IntMap a
-- | O(min(n,W)). Update the value at the minimal key.
--
-- -- 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" --updateMinWithKey :: (Key -> a -> Maybe a) -> IntMap a -> IntMap a -- | O(min(n,W)). Update the value at the maximal key. -- --
-- 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" --updateMaxWithKey :: (Key -> a -> Maybe a) -> IntMap a -> IntMap a -- | O(min(n,W)). Retrieves the minimal key of the map, and the map -- stripped of that element, or Nothing if passed an empty map. minView :: IntMap a -> Maybe (a, IntMap a) -- | O(min(n,W)). Retrieves the maximal key of the map, and the map -- stripped of that element, or Nothing if passed an empty map. maxView :: IntMap a -> Maybe (a, IntMap a) -- | O(min(n,W)). Retrieves the minimal (key,value) pair of the map, -- and the map stripped of that element, or Nothing if passed an -- empty map. -- --
-- minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a") -- minViewWithKey empty == Nothing --minViewWithKey :: IntMap a -> Maybe ((Key, a), IntMap a) -- | O(min(n,W)). Retrieves the maximal (key,value) pair of the map, -- and the map stripped of that element, or Nothing if passed an -- empty map. -- --
-- maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b") -- maxViewWithKey empty == Nothing --maxViewWithKey :: IntMap a -> Maybe ((Key, a), IntMap a) -- | O(n). Show the tree that implements the map. The tree is shown -- in a compressed, hanging format. showTree :: Show a => IntMap a -> String -- | O(n). The expression (showTreeWith hang wide -- map) shows the tree that implements the map. If hang is -- True, a hanging tree is shown otherwise a rotated tree -- is shown. If wide is True, an extra wide version is -- shown. showTreeWith :: Show a => Bool -> Bool -> IntMap a -> String -- | An efficient implementation of maps from integer keys to values -- (dictionaries). -- -- API of this module is strict in both the keys and the values. If you -- need value-lazy maps, use Data.IntMap.Lazy instead. The -- IntMap type itself is shared between the lazy and strict -- modules, meaning that the same IntMap value can be passed to -- functions in both modules (although that is rarely needed). -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import Data.IntMap.Strict (IntMap) -- import qualified Data.IntMap.Strict as IntMap ---- -- The implementation is based on big-endian patricia trees. This -- data structure performs especially well on binary operations like -- union and intersection. However, my benchmarks show that -- it is also (much) faster on insertions and deletions when compared to -- a generic size-balanced map implementation (see Data.Map). -- --
-- fromList [(5,'a'), (3,'b')] ! 1 Error: element not in the map -- fromList [(5,'a'), (3,'b')] ! 5 == 'a' --(!) :: IntMap a -> Key -> a -- | Same as difference. (\\) :: IntMap a -> IntMap b -> IntMap a infixl 9 \\ -- | O(1). Is the map empty? -- --
-- Data.IntMap.null (empty) == True -- Data.IntMap.null (singleton 1 'a') == False --null :: IntMap a -> Bool -- | O(n). Number of elements in the map. -- --
-- size empty == 0 -- size (singleton 1 'a') == 1 -- size (fromList([(1,'a'), (2,'c'), (3,'b')])) == 3 --size :: IntMap a -> Int -- | O(min(n,W)). Is the key a member of the map? -- --
-- member 5 (fromList [(5,'a'), (3,'b')]) == True -- member 1 (fromList [(5,'a'), (3,'b')]) == False --member :: Key -> IntMap a -> Bool -- | O(min(n,W)). Is the key not a member of the map? -- --
-- notMember 5 (fromList [(5,'a'), (3,'b')]) == False -- notMember 1 (fromList [(5,'a'), (3,'b')]) == True --notMember :: Key -> IntMap a -> Bool -- | O(min(n,W)). Lookup the value at a key in the map. See also -- lookup. lookup :: Key -> IntMap a -> Maybe a -- | O(min(n,W)). The expression (findWithDefault def k -- map) returns the value at key 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' --findWithDefault :: a -> Key -> IntMap a -> a -- | O(log n). Find largest key smaller than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupLT 3 (fromList [(3,'a'), (5,'b')]) == Nothing -- lookupLT 4 (fromList [(3,'a'), (5,'b')]) == Just (3, 'a') --lookupLT :: Key -> IntMap a -> Maybe (Key, a) -- | O(log n). Find smallest key greater than the given one and -- return the corresponding (key, value) pair. -- --
-- lookupGT 4 (fromList [(3,'a'), (5,'b')]) == Just (5, 'b') -- lookupGT 5 (fromList [(3,'a'), (5,'b')]) == Nothing --lookupGT :: Key -> IntMap a -> Maybe (Key, a) -- | O(log n). Find largest key smaller or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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') --lookupLE :: Key -> IntMap a -> Maybe (Key, a) -- | O(log n). Find smallest key greater or equal to the given one -- and return the corresponding (key, value) pair. -- --
-- 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 --lookupGE :: Key -> IntMap a -> Maybe (Key, a) -- | O(1). The empty map. -- --
-- empty == fromList [] -- size empty == 0 --empty :: IntMap a -- | O(1). A map of one element. -- --
-- singleton 1 'a' == fromList [(1, 'a')] -- size (singleton 1 'a') == 1 --singleton :: Key -> a -> IntMap a -- | O(min(n,W)). Insert a new key/value pair in the map. If the key -- is already present in the map, the associated value is replaced with -- the supplied value, i.e. 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' --insert :: Key -> a -> IntMap a -> IntMap a -- | O(min(n,W)). Insert with a combining function. -- insertWith f key value mp will insert the pair (key, -- value) into mp 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" --insertWith :: (a -> a -> a) -> Key -> a -> IntMap a -> IntMap a -- | O(min(n,W)). Insert with a combining function. -- insertWithKey f key value mp will insert the pair -- (key, value) into mp 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" ---- -- If the key exists in the map, this function is lazy in x but -- strict in the result of f. insertWithKey :: (Key -> a -> a -> a) -> Key -> a -> IntMap a -> IntMap a -- | O(min(n,W)). The expression (insertLookupWithKey f k -- x map) is a pair where the first element is equal to -- (lookup k map) and the second element equal to -- (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")]) --insertLookupWithKey :: (Key -> a -> a -> a) -> Key -> a -> IntMap a -> (Maybe a, IntMap a) -- | O(min(n,W)). Delete a key and its value from the map. When the -- key is not a member of the map, the original map is returned. -- --
-- 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 --delete :: Key -> IntMap a -> IntMap a -- | O(min(n,W)). Adjust a value at a specific key. When the key is -- not a member of the map, the original map is returned. -- --
-- 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
--
adjust :: (a -> a) -> Key -> IntMap a -> IntMap a
-- | O(min(n,W)). Adjust a value at a specific key. When the key is
-- not a member of the map, the original map is returned.
--
-- -- 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 --adjustWithKey :: (Key -> a -> a) -> Key -> IntMap a -> IntMap a -- | O(min(n,W)). The expression (update f k map) -- updates the value x at k (if it is in the map). If -- (f x) is Nothing, the element is deleted. If it is -- (Just y), the key k 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" --update :: (a -> Maybe a) -> Key -> IntMap a -> IntMap a -- | O(min(n,W)). The expression (update f k map) -- updates the value x at k (if it is in the map). If -- (f k x) is Nothing, the element is deleted. If it is -- (Just y), the key k 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" --updateWithKey :: (Key -> a -> Maybe a) -> Key -> IntMap a -> IntMap a -- | O(min(n,W)). Lookup and update. The function returns original -- value, if it is updated. This is different behavior than -- 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") --updateLookupWithKey :: (Key -> a -> Maybe a) -> Key -> IntMap a -> (Maybe a, IntMap a) -- | O(min(n,W)). The expression (alter f k map) -- alters the value x at k, or absence thereof. -- alter can be used to insert, delete, or update a value in an -- IntMap. In short : lookup k (alter f k m) = f -- (lookup k m). alter :: (Maybe a -> Maybe a) -> Key -> IntMap a -> IntMap a -- | O(log n). The expression (alterF f k map) -- alters the value x 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. alterF :: Functor f => (Maybe a -> f (Maybe a)) -> Key -> IntMap a -> f (IntMap a) -- | O(n+m). The (left-biased) union of two maps. It prefers the -- first map when duplicate keys are encountered, i.e. (union -- == unionWith const). -- --
-- union (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "a"), (7, "C")] --union :: IntMap a -> IntMap a -> IntMap a -- | O(n+m). The union with a combining function. -- --
-- unionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "aA"), (7, "C")] --unionWith :: (a -> a -> a) -> IntMap a -> IntMap a -> IntMap a -- | O(n+m). The union with a combining function. -- --
-- 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")] --unionWithKey :: (Key -> a -> a -> a) -> IntMap a -> IntMap a -> IntMap a -- | 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")] --unions :: [IntMap a] -> IntMap a -- | 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")] --unionsWith :: (a -> a -> a) -> [IntMap a] -> IntMap a -- | O(n+m). Difference between two maps (based on keys). -- --
-- difference (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 3 "b" --difference :: IntMap a -> IntMap b -> IntMap a -- | O(n+m). Difference with a combining function. -- --
-- 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" --differenceWith :: (a -> b -> Maybe a) -> IntMap a -> IntMap b -> IntMap a -- | O(n+m). Difference with a combining function. When two equal -- keys are encountered, the combining function is applied to the key and -- both values. If it returns Nothing, the element is discarded -- (proper set difference). If it returns (Just y), the -- element is updated with a new value y. -- --
-- 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" --differenceWithKey :: (Key -> a -> b -> Maybe a) -> IntMap a -> IntMap b -> IntMap a -- | O(n+m). The (left-biased) intersection of two maps (based on -- keys). -- --
-- intersection (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "a" --intersection :: IntMap a -> IntMap b -> IntMap a -- | O(n+m). The intersection with a combining function. -- --
-- intersectionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "aA" --intersectionWith :: (a -> b -> c) -> IntMap a -> IntMap b -> IntMap c -- | O(n+m). The intersection with a combining function. -- --
-- 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" --intersectionWithKey :: (Key -> a -> b -> c) -> IntMap a -> IntMap b -> IntMap c -- | O(n+m). A high-performance universal combining function. Using -- 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 mergeWithKey combine only1 only2, a -- function combining two IntMaps is created, such that -- --
-- map (++ "x") (fromList [(5,"a"), (3,"b")]) == fromList [(3, "bx"), (5, "ax")] --map :: (a -> b) -> IntMap a -> IntMap b -- | O(n). Map a function over all values in the map. -- --
-- let f key x = (show key) ++ ":" ++ x -- mapWithKey f (fromList [(5,"a"), (3,"b")]) == fromList [(3, "3:b"), (5, "5:a")] --mapWithKey :: (Key -> a -> b) -> IntMap a -> IntMap b -- | O(n). traverseWithKey f s == fromList -- $ traverse ((k, v) -> (,) k $ f k v) -- (toList m) That is, behaves exactly like a regular -- 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 --traverseWithKey :: Applicative t => (Key -> a -> t b) -> IntMap a -> t (IntMap b) -- | O(n). The function mapAccum threads an -- accumulating argument through the map in ascending order of keys. -- --
-- let f a b = (a ++ b, b ++ "X")
-- mapAccum f "Everything: " (fromList [(5,"a"), (3,"b")]) == ("Everything: ba", fromList [(3, "bX"), (5, "aX")])
--
mapAccum :: (a -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c)
-- | O(n). The function mapAccumWithKey threads an
-- accumulating argument through the map in ascending order of keys.
--
--
-- 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")])
--
mapAccumWithKey :: (a -> Key -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c)
-- | O(n). The function mapAccumR threads an
-- accumulating argument through the map in descending order of keys.
mapAccumRWithKey :: (a -> Key -> b -> (a, c)) -> a -> IntMap b -> (a, IntMap c)
-- | O(n*min(n,W)). mapKeys f s is the map obtained
-- by applying f 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" --mapKeys :: (Key -> Key) -> IntMap a -> IntMap a -- | O(n*log n). mapKeysWith c f s is the map -- obtained by applying f 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" --mapKeysWith :: (a -> a -> a) -> (Key -> Key) -> IntMap a -> IntMap a -- | O(n*min(n,W)). mapKeysMonotonic f s == -- mapKeys f s, but works only when f 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")] --mapKeysMonotonic :: (Key -> Key) -> IntMap a -> IntMap a -- | O(n). Fold the values in the map using the given -- right-associative binary operator, such that foldr f z == -- foldr f z . elems. -- -- For example, -- --
-- elems map = foldr (:) [] map ---- --
-- let f a len = len + (length a) -- foldr f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldr :: (a -> b -> b) -> b -> IntMap a -> b -- | O(n). Fold the values in the map using the given -- left-associative binary operator, such that foldl f z == -- foldl f z . elems. -- -- For example, -- --
-- elems = reverse . foldl (flip (:)) [] ---- --
-- let f len a = len + (length a) -- foldl f 0 (fromList [(5,"a"), (3,"bbb")]) == 4 --foldl :: (a -> b -> a) -> a -> IntMap b -> a -- | O(n). Fold the keys and values in the map using the given -- right-associative binary operator, such that 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)"
--
foldrWithKey :: (Key -> a -> b -> b) -> b -> IntMap a -> b
-- | O(n). Fold the keys and values in the map using the given
-- left-associative binary operator, such that 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)"
--
foldlWithKey :: (a -> Key -> b -> a) -> a -> IntMap b -> a
-- | O(n). Fold the keys and values in the map using the given
-- monoid, such that
--
-- -- foldMapWithKey f = fold . mapWithKey f ---- -- This can be an asymptotically faster than foldrWithKey or -- foldlWithKey for some monoids. foldMapWithKey :: Monoid m => (Key -> a -> m) -> IntMap a -> m -- | O(n). A strict version of foldr. Each application of the -- operator is evaluated before using the result in the next application. -- This function is strict in the starting value. foldr' :: (a -> b -> b) -> b -> IntMap a -> b -- | O(n). A strict version of foldl. 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 -- | O(n). A strict version of foldrWithKey. 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 -- | O(n). A strict version of foldlWithKey. 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 -- | O(n). Return all elements of the map in the ascending order of -- their keys. Subject to list fusion. -- --
-- elems (fromList [(5,"a"), (3,"b")]) == ["b","a"] -- elems empty == [] --elems :: IntMap a -> [a] -- | O(n). Return all keys of the map in ascending order. Subject to -- list fusion. -- --
-- keys (fromList [(5,"a"), (3,"b")]) == [3,5] -- keys empty == [] --keys :: IntMap a -> [Key] -- | O(n). An alias for 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 == [] --assocs :: IntMap a -> [(Key, a)] -- | O(n*min(n,W)). The set of all keys of the map. -- --
-- keysSet (fromList [(5,"a"), (3,"b")]) == Data.IntSet.fromList [3,5] -- keysSet empty == Data.IntSet.empty --keysSet :: IntMap a -> IntSet -- | O(n). Build a map from a set of keys and a function which for -- each key computes its value. -- --
-- fromSet (\k -> replicate k 'a') (Data.IntSet.fromList [3, 5]) == fromList [(5,"aaaaa"), (3,"aaa")] -- fromSet undefined Data.IntSet.empty == empty --fromSet :: (Key -> a) -> IntSet -> IntMap a -- | O(n). Convert the map to a list of key/value pairs. Subject to -- list fusion. -- --
-- toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] -- toList empty == [] --toList :: IntMap a -> [(Key, a)] -- | O(n*min(n,W)). Create a map from a list of key/value pairs. -- --
-- 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")] --fromList :: [(Key, a)] -> IntMap a -- | O(n*min(n,W)). Create a map from a list of key/value pairs with -- a combining function. See also fromAscListWith. -- --
-- fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")] -- fromListWith (++) [] == empty --fromListWith :: (a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n*min(n,W)). Build a map from a list of key/value pairs with -- a combining function. See also fromAscListWithKey'. -- --
-- fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")] -- fromListWith (++) [] == empty --fromListWithKey :: (Key -> a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in ascending order. Subject to list fusion. -- --
-- toAscList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")] --toAscList :: IntMap a -> [(Key, a)] -- | O(n). Convert the map to a list of key/value pairs where the -- keys are in descending order. Subject to list fusion. -- --
-- toDescList (fromList [(5,"a"), (3,"b")]) == [(5,"a"), (3,"b")] --toDescList :: IntMap a -> [(Key, a)] -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order. -- --
-- fromAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] -- fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")] --fromAscList :: [(Key, a)] -> IntMap a -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order, with a combining function on equal keys. -- The precondition (input list is ascending) is not checked. -- --
-- fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")] --fromAscListWith :: (a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order, with a combining function on equal keys. -- The precondition (input list is ascending) is not checked. -- --
-- fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")] --fromAscListWithKey :: (Key -> a -> a -> a) -> [(Key, a)] -> IntMap a -- | O(n). Build a map from a list of key/value pairs where the keys -- are in ascending order and all distinct. The precondition (input -- list is strictly ascending) is not checked. -- --
-- fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")] --fromDistinctAscList :: [(Key, a)] -> IntMap a -- | O(n). Filter all values that satisfy some predicate. -- --
-- 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 --filter :: (a -> Bool) -> IntMap a -> IntMap a -- | O(n). Filter all keys/values that satisfy some predicate. -- --
-- filterWithKey (\k _ -> k > 4) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a" --filterWithKey :: (Key -> a -> Bool) -> IntMap a -> IntMap a -- | O(n+m). The restriction of a map to the keys in a set. -- --
-- m restrictKeys s = filterWithKey (k _ -> k `member' s) m --restrictKeys :: IntMap a -> IntSet -> IntMap a -- | Remove all the keys in a given set from a map. -- --
-- m withoutKeys s = filterWithKey (k _ -> k `notMember' s) m --withoutKeys :: IntMap a -> IntSet -> IntMap a -- | O(n). Partition the map according to some predicate. The first -- map contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partition :: (a -> Bool) -> IntMap a -> (IntMap a, IntMap a) -- | O(n). Partition the map according to some predicate. The first -- map contains all elements that satisfy the predicate, the second all -- elements that fail the predicate. See also 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")]) --partitionWithKey :: (Key -> a -> Bool) -> IntMap a -> (IntMap a, IntMap a) -- | O(n). Map values and collect the 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" --mapMaybe :: (a -> Maybe b) -> IntMap a -> IntMap b -- | O(n). Map keys/values and collect the 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"
--
mapMaybeWithKey :: (Key -> a -> Maybe b) -> IntMap a -> IntMap b
-- | O(n). Map values and separate the 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")]) --mapEither :: (a -> Either b c) -> IntMap a -> (IntMap b, IntMap c) -- | O(n). Map keys/values and separate the 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")]) --mapEitherWithKey :: (Key -> a -> Either b c) -> IntMap a -> (IntMap b, IntMap c) -- | O(min(n,W)). The expression (split k map) is a -- pair (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) --split :: Key -> IntMap a -> (IntMap a, IntMap a) -- | O(min(n,W)). Performs a 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) --splitLookup :: Key -> IntMap a -> (IntMap a, Maybe a, IntMap a) -- | O(1). Decompose a map into pieces based on the structure of the -- underlying tree. This function is useful for consuming a map in -- parallel. -- -- 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. splitRoot :: IntMap a -> [IntMap a] -- | O(n+m). Is this a submap? Defined as (isSubmapOf = -- isSubmapOfBy (==)). isSubmapOf :: Eq a => IntMap a -> IntMap a -> Bool -- | O(n+m). The expression (isSubmapOfBy f m1 m2) -- returns True 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)]) --isSubmapOfBy :: (a -> b -> Bool) -> IntMap a -> IntMap b -> Bool -- | O(n+m). Is this a proper submap? (ie. a submap but not equal). -- Defined as (isProperSubmapOf = isProperSubmapOfBy -- (==)). isProperSubmapOf :: Eq a => IntMap a -> IntMap a -> Bool -- | O(n+m). Is this a proper submap? (ie. a submap but not equal). -- The expression (isProperSubmapOfBy f m1 m2) returns -- True when m1 and 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)]) --isProperSubmapOfBy :: (a -> b -> Bool) -> IntMap a -> IntMap b -> Bool -- | O(min(n,W)). The minimal key of the map. findMin :: IntMap a -> (Key, a) -- | O(min(n,W)). The maximal key of the map. findMax :: IntMap a -> (Key, a) -- | O(min(n,W)). Delete the minimal key. Returns an empty map if -- the map is empty. -- -- Note that this is a change of behaviour for consistency with -- Map – versions prior to 0.5 threw an error if the IntMap -- was already empty. deleteMin :: IntMap a -> IntMap a -- | O(min(n,W)). Delete the maximal key. Returns an empty map if -- the map is empty. -- -- Note that this is a change of behaviour for consistency with -- Map – versions prior to 0.5 threw an error if the IntMap -- was already empty. deleteMax :: IntMap a -> IntMap a -- | O(min(n,W)). Delete and find the minimal element. deleteFindMin :: IntMap a -> ((Key, a), IntMap a) -- | O(min(n,W)). Delete and find the maximal element. deleteFindMax :: IntMap a -> ((Key, a), IntMap a) -- | O(log n). Update the value at the minimal key. -- --
-- 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"
--
updateMin :: (a -> Maybe a) -> IntMap a -> IntMap a
-- | O(log n). Update the value at the maximal key.
--
--
-- 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"
--
updateMax :: (a -> Maybe a) -> IntMap a -> IntMap a
-- | O(log n). Update the value at the minimal key.
--
-- -- 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" --updateMinWithKey :: (Key -> a -> Maybe a) -> IntMap a -> IntMap a -- | O(log n). Update the value at the maximal key. -- --
-- 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" --updateMaxWithKey :: (Key -> a -> Maybe a) -> IntMap a -> IntMap a -- | O(min(n,W)). Retrieves the minimal key of the map, and the map -- stripped of that element, or Nothing if passed an empty map. minView :: IntMap a -> Maybe (a, IntMap a) -- | O(min(n,W)). Retrieves the maximal key of the map, and the map -- stripped of that element, or Nothing if passed an empty map. maxView :: IntMap a -> Maybe (a, IntMap a) -- | O(min(n,W)). Retrieves the minimal (key,value) pair of the map, -- and the map stripped of that element, or Nothing if passed an -- empty map. -- --
-- minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a") -- minViewWithKey empty == Nothing --minViewWithKey :: IntMap a -> Maybe ((Key, a), IntMap a) -- | O(min(n,W)). Retrieves the maximal (key,value) pair of the map, -- and the map stripped of that element, or Nothing if passed an -- empty map. -- --
-- maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b") -- maxViewWithKey empty == Nothing --maxViewWithKey :: IntMap a -> Maybe ((Key, a), IntMap a) -- | O(n). Show the tree that implements the map. The tree is shown -- in a compressed, hanging format. showTree :: Show a => IntMap a -> String -- | O(n). The expression (showTreeWith hang wide -- map) shows the tree that implements the map. If hang is -- True, a hanging tree is shown otherwise a rotated tree -- is shown. If wide is True, an extra wide version is -- shown. showTreeWith :: Show a => Bool -> Bool -> IntMap a -> String -- | An efficient implementation of maps from integer keys to values -- (dictionaries). -- -- This module re-exports the value lazy Data.IntMap.Lazy API, -- plus several deprecated value strict functions. Please note that these -- functions have different strictness properties than those in -- Data.IntMap.Strict: they only evaluate the result of the -- combining function. For example, the default value to -- insertWith' is only evaluated if the combining function is -- called and uses it. -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import Data.IntMap (IntMap) -- import qualified Data.IntMap as IntMap ---- -- The implementation is based on big-endian patricia trees. This -- data structure performs especially well on binary operations like -- union and intersection. However, my benchmarks show that -- it is also (much) faster on insertions and deletions when compared to -- a generic size-balanced map implementation (see Data.Map). -- --