IntervalMap-0.4.1.1: bench/RBColorNode.hs
module RBColorNode (
-- * re-export
Interval(..)
-- * Map type
, IntervalMap -- instance Eq,Show,Read
-- * Operators
, (!)
-- * Query
, null
, size
, member
, notMember
, lookup
, findWithDefault
-- ** Interval query
, containing
, intersecting
, within
-- * Construction
, empty
, singleton
-- * Conversion
, elems
, keys
, keysSet
, assocs
-- ** Lists
, toList
-- ** Ordered lists
, toAscList
, toDescList
, fromAscList
, fromAscListWith
, fromAscListWithKey
, fromDistinctAscList
-- * Testing
, height, maxHeight, showStats
) where
import Prelude hiding (null, lookup, map, filter, foldr, foldl)
import RBColorNodeBase as M hiding (
singleton
, findWithDefault
, fromAscList
, fromAscListWith
, fromAscListWithKey
)
-- | /O(1)/. A map with one entry.
singleton :: k -> v -> IntervalMap k v
singleton k v = v `seq` NodeB k k v Nil Nil
-- | /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 -> IntervalMap k a -> a
findWithDefault def k m = def `seq` case M.lookup k m of
Nothing -> def
Just x -> x
-- | /O(n)/. Build a map from an ascending list in linear time.
-- /The precondition (input list is ascending) is not checked./
fromAscList :: (Interval k e, Eq k) => [(k,v)] -> IntervalMap k v
fromAscList xs = fromAscListWith (\_ b -> b) xs
-- | /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 :: (Interval k e, Eq k) => (a -> a -> a) -> [(k,a)] -> IntervalMap k a
fromAscListWith f xs = fromAscListWithKey (\_ a b -> f a b) xs
-- | /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./
fromAscListWithKey :: (Interval k e, Eq k) => (k -> a -> a -> a) -> [(k,a)] -> IntervalMap k a
fromAscListWithKey f xs = fromDistinctAscList (combineEq f xs)
combineEq :: Eq k => (k -> a -> a -> a) -> [(k,a)] -> [(k,a)]
combineEq _ [] = []
combineEq _ xs@[_] = xs
combineEq f (x@(xk,xv) : xs@((yk,yv) : xs'))
| xk == yk = let v' = f xk xv yv in v' `seq` combineEq f ((xk, v') : xs')
| otherwise = x : combineEq f xs