{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE Safe #-}
module Data.RangeSet.Map (
RSet
, (\\)
, null
, isFull
, size
, member
, notMember
, lookupLT
, lookupGT
, lookupLE
, lookupGE
, containsRange
, isSubsetOf
, valid
, empty
, full
, singleton
, singletonRange
, insert
, insertRange
, delete
, deleteRange
, union
, difference
, intersection
, split
, splitMember
, findMin
, findMax
, complement
, elems
, toList
, fromList
, fromAscList
, toAscList
, toRangeList
, fromRangeList
, fromRList
, toRList
, fromNormalizedRangeList
) where
import Prelude hiding (filter, foldl, foldr, map, null)
import Control.DeepSeq (NFData (..))
import qualified Data.Foldable as Fold
import Data.Functor ((<$>))
import qualified Data.Map.Strict as Map
import Data.Monoid (Monoid (..), getSum)
import Data.Semigroup (Semigroup (..))
import Data.Typeable (Typeable)
import Data.RangeSet.Internal
import qualified Data.RangeSet.List as RList
newtype RSet a = RSet (Map.Map a a)
deriving (RSet a -> RSet a -> Bool
(RSet a -> RSet a -> Bool)
-> (RSet a -> RSet a -> Bool) -> Eq (RSet a)
forall a. Eq a => RSet a -> RSet a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => RSet a -> RSet a -> Bool
== :: RSet a -> RSet a -> Bool
$c/= :: forall a. Eq a => RSet a -> RSet a -> Bool
/= :: RSet a -> RSet a -> Bool
Eq, Eq (RSet a)
Eq (RSet a) =>
(RSet a -> RSet a -> Ordering)
-> (RSet a -> RSet a -> Bool)
-> (RSet a -> RSet a -> Bool)
-> (RSet a -> RSet a -> Bool)
-> (RSet a -> RSet a -> Bool)
-> (RSet a -> RSet a -> RSet a)
-> (RSet a -> RSet a -> RSet a)
-> Ord (RSet a)
RSet a -> RSet a -> Bool
RSet a -> RSet a -> Ordering
RSet a -> RSet a -> RSet a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (RSet a)
forall a. Ord a => RSet a -> RSet a -> Bool
forall a. Ord a => RSet a -> RSet a -> Ordering
forall a. Ord a => RSet a -> RSet a -> RSet a
$ccompare :: forall a. Ord a => RSet a -> RSet a -> Ordering
compare :: RSet a -> RSet a -> Ordering
$c< :: forall a. Ord a => RSet a -> RSet a -> Bool
< :: RSet a -> RSet a -> Bool
$c<= :: forall a. Ord a => RSet a -> RSet a -> Bool
<= :: RSet a -> RSet a -> Bool
$c> :: forall a. Ord a => RSet a -> RSet a -> Bool
> :: RSet a -> RSet a -> Bool
$c>= :: forall a. Ord a => RSet a -> RSet a -> Bool
>= :: RSet a -> RSet a -> Bool
$cmax :: forall a. Ord a => RSet a -> RSet a -> RSet a
max :: RSet a -> RSet a -> RSet a
$cmin :: forall a. Ord a => RSet a -> RSet a -> RSet a
min :: RSet a -> RSet a -> RSet a
Ord, Typeable)
instance Show a => Show (RSet a) where
showsPrec :: Int -> RSet a -> ShowS
showsPrec Int
d RSet a
x = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10)
(ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"fromRangeList "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [(a, a)] -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
x)
instance (Ord a, Enum a) => Semigroup (RSet a) where
<> :: RSet a -> RSet a -> RSet a
(<>) = RSet a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
union
instance (Ord a, Enum a) => Monoid (RSet a) where
mempty :: RSet a
mempty = RSet a
forall a. RSet a
empty
mappend :: RSet a -> RSet a -> RSet a
mappend = RSet a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
union
instance NFData a => NFData (RSet a) where
rnf :: RSet a -> ()
rnf (RSet Map a a
xs) = Map a a -> ()
forall a. NFData a => a -> ()
rnf Map a a
xs
infixl 9 \\
(\\) :: (Ord a, Enum a) => RSet a -> RSet a -> RSet a
RSet a
m1 \\ :: forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
\\ RSet a
m2 = RSet a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
difference RSet a
m1 RSet a
m2
null :: RSet a -> Bool
null :: forall a. RSet a -> Bool
null (RSet Map a a
m) = Map a a -> Bool
forall k a. Map k a -> Bool
Map.null Map a a
m
isFull :: (Eq a, Bounded a) => RSet a -> Bool
isFull :: forall a. (Eq a, Bounded a) => RSet a -> Bool
isFull = RSet a -> RSet a -> Bool
forall a. Eq a => a -> a -> Bool
(==) RSet a
forall a. Bounded a => RSet a
full
size :: Enum a => RSet a -> Int
size :: forall a. Enum a => RSet a -> Int
size (RSet Map a a
xm) = Sum Int -> Int
forall a. Sum a -> a
getSum (Sum Int -> Int) -> Sum Int -> Int
forall a b. (a -> b) -> a -> b
$ (a -> a -> Sum Int) -> Map a a -> Sum Int
forall m k a. Monoid m => (k -> a -> m) -> Map k a -> m
Map.foldMapWithKey a -> a -> Sum Int
forall a. Enum a => a -> a -> Sum Int
rangeSize Map a a
xm
contains' :: Ord a => a -> a -> RSet a -> Bool
contains' :: forall a. Ord a => a -> a -> RSet a -> Bool
contains' a
x a
y (RSet Map a a
xm) = ((a, a) -> Bool) -> Maybe (a, a) -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
Fold.any ((a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<=) (a -> Bool) -> ((a, a) -> a) -> (a, a) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> a
forall a b. (a, b) -> b
snd) (Maybe (a, a) -> Bool) -> Maybe (a, a) -> Bool
forall a b. (a -> b) -> a -> b
$ a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupLE a
x Map a a
xm
member :: Ord a => a -> RSet a -> Bool
member :: forall a. Ord a => a -> RSet a -> Bool
member a
x = a -> a -> RSet a -> Bool
forall a. Ord a => a -> a -> RSet a -> Bool
contains' a
x a
x
notMember :: Ord a => a -> RSet a -> Bool
notMember :: forall a. Ord a => a -> RSet a -> Bool
notMember a
a RSet a
r = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ a -> RSet a -> Bool
forall a. Ord a => a -> RSet a -> Bool
member a
a RSet a
r
lookupLT :: (Ord a, Enum a) => a -> RSet a -> Maybe a
lookupLT :: forall a. (Ord a, Enum a) => a -> RSet a -> Maybe a
lookupLT a
x (RSet Map a a
xm) = a -> a -> a
forall a. Ord a => a -> a -> a
min (a -> a
forall a. Enum a => a -> a
pred a
x) (a -> a) -> ((a, a) -> a) -> (a, a) -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> a
forall a b. (a, b) -> b
snd ((a, a) -> a) -> Maybe (a, a) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupLT a
x Map a a
xm
lookupGT :: (Ord a, Enum a) => a -> RSet a -> Maybe a
lookupGT :: forall a. (Ord a, Enum a) => a -> RSet a -> Maybe a
lookupGT a
x (RSet Map a a
xm)
| Just (a
_, a
b) <- a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupLE a
x Map a a
xm, a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
b = a -> Maybe a
forall a. a -> Maybe a
Just (a -> a
forall a. Enum a => a -> a
succ a
x)
| Bool
otherwise = (a, a) -> a
forall a b. (a, b) -> a
fst ((a, a) -> a) -> Maybe (a, a) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupGT a
x Map a a
xm
lookupLE :: Ord a => a -> RSet a -> Maybe a
lookupLE :: forall a. Ord a => a -> RSet a -> Maybe a
lookupLE a
x (RSet Map a a
xm) = a -> a -> a
forall a. Ord a => a -> a -> a
min a
x (a -> a) -> ((a, a) -> a) -> (a, a) -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> a
forall a b. (a, b) -> b
snd ((a, a) -> a) -> Maybe (a, a) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupLE a
x Map a a
xm
lookupGE :: Ord a => a -> RSet a -> Maybe a
lookupGE :: forall a. Ord a => a -> RSet a -> Maybe a
lookupGE a
x (RSet Map a a
xm)
| Just (a
_, a
b) <- a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupLE a
x Map a a
xm, a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
b = a -> Maybe a
forall a. a -> Maybe a
Just a
x
| Bool
otherwise = (a, a) -> a
forall a b. (a, b) -> a
fst ((a, a) -> a) -> Maybe (a, a) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Map a a -> Maybe (a, a)
forall k v. Ord k => k -> Map k v -> Maybe (k, v)
Map.lookupGT a
x Map a a
xm
containsRange :: Ord a => (a, a) -> RSet a -> Bool
containsRange :: forall a. Ord a => (a, a) -> RSet a -> Bool
containsRange (a
x,a
y) RSet a
s
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y = a -> a -> RSet a -> Bool
forall a. Ord a => a -> a -> RSet a -> Bool
contains' a
x a
y RSet a
s
| Bool
otherwise = Bool
True
isSubsetOf :: Ord a => RSet a -> RSet a -> Bool
isSubsetOf :: forall a. Ord a => RSet a -> RSet a -> Bool
isSubsetOf RSet a
x RSet a
y = [(a, a)] -> [(a, a)] -> Bool
forall a. Ord a => [(a, a)] -> [(a, a)] -> Bool
isSubsetRangeList (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
x) (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
y)
empty :: RSet a
empty :: forall a. RSet a
empty = Map a a -> RSet a
forall a. Map a a -> RSet a
RSet Map a a
forall k a. Map k a
Map.empty
full :: Bounded a => RSet a
full :: forall a. Bounded a => RSet a
full = a -> a -> RSet a
forall a. a -> a -> RSet a
singletonRange' a
forall a. Bounded a => a
minBound a
forall a. Bounded a => a
maxBound
singletonRange' :: a -> a -> RSet a
singletonRange' :: forall a. a -> a -> RSet a
singletonRange' a
x a
y = Map a a -> RSet a
forall a. Map a a -> RSet a
RSet (Map a a -> RSet a) -> Map a a -> RSet a
forall a b. (a -> b) -> a -> b
$ a -> a -> Map a a
forall k a. k -> a -> Map k a
Map.singleton a
x a
y
singleton :: a -> RSet a
singleton :: forall a. a -> RSet a
singleton a
x = a -> a -> RSet a
forall a. a -> a -> RSet a
singletonRange' a
x a
x
singletonRange :: Ord a => (a, a) -> RSet a
singletonRange :: forall a. Ord a => (a, a) -> RSet a
singletonRange (a
x, a
y) | a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y = RSet a
forall a. RSet a
empty
| Bool
otherwise = a -> a -> RSet a
forall a. a -> a -> RSet a
singletonRange' a
x a
y
insertRange' :: (Ord a, Enum a) => a -> a -> RSet a -> RSet a
insertRange' :: forall a. (Ord a, Enum a) => a -> a -> RSet a -> RSet a
insertRange' a
x a
y RSet a
s = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> [(a, a)] -> RSet a
forall a b. (a -> b) -> a -> b
$ a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
insertRangeList a
x a
y ([(a, a)] -> [(a, a)]) -> [(a, a)] -> [(a, a)]
forall a b. (a -> b) -> a -> b
$ RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
s
insert :: (Ord a, Enum a) => a -> RSet a -> RSet a
insert :: forall a. (Ord a, Enum a) => a -> RSet a -> RSet a
insert a
x = a -> a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => a -> a -> RSet a -> RSet a
insertRange' a
x a
x
insertRange :: (Ord a, Enum a) => (a, a) -> RSet a -> RSet a
insertRange :: forall a. (Ord a, Enum a) => (a, a) -> RSet a -> RSet a
insertRange (a
x, a
y) RSet a
set
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y = RSet a
set
| Bool
otherwise = a -> a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => a -> a -> RSet a -> RSet a
insertRange' a
x a
y RSet a
set
deleteRange' :: (Ord a, Enum a) => a -> a -> RSet a -> RSet a
deleteRange' :: forall a. (Ord a, Enum a) => a -> a -> RSet a -> RSet a
deleteRange' a
x a
y = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> (RSet a -> [(a, a)]) -> RSet a -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
deleteRangeList a
x a
y ([(a, a)] -> [(a, a)])
-> (RSet a -> [(a, a)]) -> RSet a -> [(a, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList
delete :: (Ord a, Enum a) => a -> RSet a -> RSet a
delete :: forall a. (Ord a, Enum a) => a -> RSet a -> RSet a
delete a
x = a -> a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => a -> a -> RSet a -> RSet a
deleteRange' a
x a
x
deleteRange :: (Ord a, Enum a) => (a, a) -> RSet a -> RSet a
deleteRange :: forall a. (Ord a, Enum a) => (a, a) -> RSet a -> RSet a
deleteRange (a
x, a
y) RSet a
set
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y = RSet a
set
| Bool
otherwise = a -> a -> RSet a -> RSet a
forall a. (Ord a, Enum a) => a -> a -> RSet a -> RSet a
deleteRange' a
x a
y RSet a
set
union :: (Ord a, Enum a) => RSet a -> RSet a -> RSet a
union :: forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
union RSet a
x RSet a
y = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> [(a, a)] -> RSet a
forall a b. (a -> b) -> a -> b
$ [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
unionRangeList (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
x) (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
y)
difference :: (Ord a, Enum a) => RSet a -> RSet a -> RSet a
difference :: forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
difference RSet a
x RSet a
y = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> [(a, a)] -> RSet a
forall a b. (a -> b) -> a -> b
$ [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
differenceRangeList (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
x) (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
y)
intersection :: (Ord a, Enum a) => RSet a -> RSet a -> RSet a
intersection :: forall a. (Ord a, Enum a) => RSet a -> RSet a -> RSet a
intersection RSet a
x RSet a
y = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> [(a, a)] -> RSet a
forall a b. (a -> b) -> a -> b
$ [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
x) (RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList RSet a
y)
complement :: (Ord a, Enum a, Bounded a) => RSet a -> RSet a
complement :: forall a. (Ord a, Enum a, Bounded a) => RSet a -> RSet a
complement = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> (RSet a -> [(a, a)]) -> RSet a -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a, Bounded a) => [(a, a)] -> [(a, a)]
complementRangeList ([(a, a)] -> [(a, a)])
-> (RSet a -> [(a, a)]) -> RSet a -> [(a, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList
split :: (Ord a, Enum a) => a -> RSet a -> (RSet a, RSet a)
split :: forall a. (Ord a, Enum a) => a -> RSet a -> (RSet a, RSet a)
split a
x RSet a
s = (RSet a
l, RSet a
r) where (RSet a
l, Bool
_, RSet a
r) = a -> RSet a -> (RSet a, Bool, RSet a)
forall a. (Ord a, Enum a) => a -> RSet a -> (RSet a, Bool, RSet a)
splitMember a
x RSet a
s
splitMember :: (Ord a, Enum a) => a -> RSet a -> (RSet a, Bool, RSet a)
splitMember :: forall a. (Ord a, Enum a) => a -> RSet a -> (RSet a, Bool, RSet a)
splitMember a
x (RSet Map a a
xm)
| Just a
y <- Maybe a
xv = (Map a a -> RSet a
forall a. Map a a -> RSet a
RSet Map a a
ml, Bool
True, Map a a -> RSet a
forall a. Map a a -> RSet a
RSet (Map a a -> RSet a) -> Map a a -> RSet a
forall a b. (a -> b) -> a -> b
$ Bool -> a -> a -> Map a a -> Map a a
forall {k} {a}. Ord k => Bool -> k -> a -> Map k a -> Map k a
insertIf (a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
y) (a -> a
forall a. Enum a => a -> a
succ a
x) a
y Map a a
mr)
| Just ((a
u,a
v), Map a a
ml') <- Map a a -> Maybe ((a, a), Map a a)
forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.maxViewWithKey Map a a
ml =
if a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x
then (Map a a -> RSet a
forall a. Map a a -> RSet a
RSet Map a a
ml, Bool
False, Map a a -> RSet a
forall a. Map a a -> RSet a
RSet Map a a
mr)
else (Map a a -> RSet a
forall a. Map a a -> RSet a
RSet (Map a a -> RSet a) -> Map a a -> RSet a
forall a b. (a -> b) -> a -> b
$ Bool -> a -> a -> Map a a -> Map a a
forall {k} {a}. Ord k => Bool -> k -> a -> Map k a -> Map k a
insertIf (a
u a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x) a
u (a -> a
forall a. Enum a => a -> a
pred a
x) Map a a
ml', Bool
True, Map a a -> RSet a
forall a. Map a a -> RSet a
RSet (Map a a -> RSet a) -> Map a a -> RSet a
forall a b. (a -> b) -> a -> b
$ Bool -> a -> a -> Map a a -> Map a a
forall {k} {a}. Ord k => Bool -> k -> a -> Map k a -> Map k a
insertIf (a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
v) (a -> a
forall a. Enum a => a -> a
succ a
x) a
v Map a a
mr)
| Bool
otherwise = (Map a a -> RSet a
forall a. Map a a -> RSet a
RSet Map a a
ml , Bool
False, Map a a -> RSet a
forall a. Map a a -> RSet a
RSet Map a a
xm)
where
(Map a a
ml, Maybe a
xv, Map a a
mr) = a -> Map a a -> (Map a a, Maybe a, Map a a)
forall k a. Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a)
Map.splitLookup a
x Map a a
xm
insertIf :: Bool -> k -> a -> Map k a -> Map k a
insertIf Bool
False k
_ a
_ = Map k a -> Map k a
forall a. a -> a
id
insertIf Bool
True k
a a
b = k -> a -> Map k a -> Map k a
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert k
a a
b
findMin :: RSet a -> a
findMin :: forall a. RSet a -> a
findMin (RSet Map a a
m) = (a, a) -> a
forall a b. (a, b) -> a
fst ((a, a) -> a) -> (a, a) -> a
forall a b. (a -> b) -> a -> b
$ Map a a -> (a, a)
forall k a. Map k a -> (k, a)
Map.findMin Map a a
m
findMax :: RSet a -> a
findMax :: forall a. RSet a -> a
findMax (RSet Map a a
m) = (a, a) -> a
forall a b. (a, b) -> b
snd ((a, a) -> a) -> (a, a) -> a
forall a b. (a -> b) -> a -> b
$ Map a a -> (a, a)
forall k a. Map k a -> (k, a)
Map.findMax Map a a
m
unRangeList :: [(a, a)] -> RSet a
unRangeList :: forall a. [(a, a)] -> RSet a
unRangeList = Map a a -> RSet a
forall a. Map a a -> RSet a
RSet (Map a a -> RSet a) -> ([(a, a)] -> Map a a) -> [(a, a)] -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, a)] -> Map a a
forall k a. [(k, a)] -> Map k a
Map.fromDistinctAscList
elems :: Enum a => RSet a -> [a]
elems :: forall a. Enum a => RSet a -> [a]
elems = RSet a -> [a]
forall a. Enum a => RSet a -> [a]
toAscList
toList :: Enum a => RSet a -> [a]
toList :: forall a. Enum a => RSet a -> [a]
toList (RSet Map a a
xm) = (a -> a -> [a]) -> Map a a -> [a]
forall m k a. Monoid m => (k -> a -> m) -> Map k a -> m
Map.foldMapWithKey a -> a -> [a]
forall a. Enum a => a -> a -> [a]
enumFromTo Map a a
xm
fromList :: (Ord a, Enum a) => [a] -> RSet a
fromList :: forall a. (Ord a, Enum a) => [a] -> RSet a
fromList = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> ([a] -> [(a, a)]) -> [a] -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [(a, a)]
forall a. (Ord a, Enum a) => [a] -> [(a, a)]
fromElemList
fromAscList :: (Ord a, Enum a) => [a] -> RSet a
fromAscList :: forall a. (Ord a, Enum a) => [a] -> RSet a
fromAscList = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a) -> ([a] -> [(a, a)]) -> [a] -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [(a, a)]
forall a. (Eq a, Enum a) => [a] -> [(a, a)]
fromAscElemList
toAscList :: Enum a => RSet a -> [a]
toAscList :: forall a. Enum a => RSet a -> [a]
toAscList (RSet Map a a
xm) = (a -> a -> [a] -> [a]) -> [a] -> Map a a -> [a]
forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey (\a
a -> [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++) ([a] -> [a] -> [a]) -> (a -> [a]) -> a -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a -> [a]
forall a. Enum a => a -> a -> [a]
enumFromTo a
a) [] Map a a
xm
toRangeList :: RSet a -> [(a, a)]
toRangeList :: forall a. RSet a -> [(a, a)]
toRangeList (RSet Map a a
xs) = Map a a -> [(a, a)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a a
xs
fromRangeList :: (Ord a, Enum a) => [(a, a)] -> RSet a
fromRangeList :: forall a. (Ord a, Enum a) => [(a, a)] -> RSet a
fromRangeList = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
unRangeList ([(a, a)] -> RSet a)
-> ([(a, a)] -> [(a, a)]) -> [(a, a)] -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)]
normalizeRangeList
fromRList :: RList.RSet a -> RSet a
fromRList :: forall a. RSet a -> RSet a
fromRList = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
fromNormalizedRangeList ([(a, a)] -> RSet a) -> (RSet a -> [(a, a)]) -> RSet a -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
RList.toRangeList
toRList :: RSet a -> RList.RSet a
toRList :: forall a. RSet a -> RSet a
toRList = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RList.fromNormalizedRangeList ([(a, a)] -> RSet a) -> (RSet a -> [(a, a)]) -> RSet a -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList
fromNormalizedRangeList :: [(a, a)] -> RSet a
fromNormalizedRangeList :: forall a. [(a, a)] -> RSet a
fromNormalizedRangeList = Map a a -> RSet a
forall a. Map a a -> RSet a
RSet (Map a a -> RSet a) -> ([(a, a)] -> Map a a) -> [(a, a)] -> RSet a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, a)] -> Map a a
forall k a. [(k, a)] -> Map k a
Map.fromDistinctAscList
valid :: (Ord a, Enum a, Bounded a) => RSet a -> Bool
valid :: forall a. (Ord a, Enum a, Bounded a) => RSet a -> Bool
valid (RSet Map a a
xm) = Map a a -> Bool
forall k a. Ord k => Map k a -> Bool
Map.valid Map a a
xm Bool -> Bool -> Bool
&& [(a, a)] -> Bool
forall a. (Ord a, Enum a, Bounded a) => [(a, a)] -> Bool
validRangeList (Map a a -> [(a, a)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map a a
xm)