module RBColorInt ( -- * 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 -- * Min\/Max , findMin , findMax , findLast -- * Debugging , valid -- * Testing , height, maxHeight, showStats ) where import Prelude hiding (null, lookup, map, filter, foldr, foldl) import RBColorIntBase as M hiding ( singleton , findWithDefault , fromAscList , fromAscListWith , fromAscListWithKey ) cBLACK :: Int cBLACK = 1 -- | /O(1)/. A map with one entry. singleton :: k -> v -> IntervalMap k v singleton k v = v `seq` Node cBLACK 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