{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE Safe #-}
module Data.RangeSet.List (
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
, fromNormalizedRangeList
, toSet
) where
import Prelude hiding (filter, foldl, foldr, map, null)
import qualified Prelude
import Control.DeepSeq (NFData (..))
import Data.Foldable (foldMap)
import Data.Hashable (Hashable (..))
import Data.Maybe (isJust)
import Data.Monoid (Monoid (..), getSum)
import Data.Semigroup (Semigroup (..))
import qualified Data.Set as Set
import Data.Typeable (Typeable)
import Data.RangeSet.Internal
newtype RSet a = RSet [(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 Hashable a => Hashable (RSet a) where
hashWithSalt :: Int -> RSet a -> Int
hashWithSalt Int
salt (RSet [(a, a)]
xs) = Int -> [(a, a)] -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
salt [(a, a)]
xs
instance NFData a => NFData (RSet a) where
rnf :: RSet a -> ()
rnf (RSet [(a, a)]
xs) = [(a, a)] -> ()
forall a. NFData a => a -> ()
rnf [(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 = [(a, a)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
Prelude.null ([(a, a)] -> Bool) -> (RSet a -> [(a, a)]) -> RSet a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RSet a -> [(a, a)]
forall a. RSet a -> [(a, a)]
toRangeList
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 [(a, a)]
xs) = 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) -> [(a, a)] -> Sum Int
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ((a -> a -> Sum Int) -> (a, a) -> Sum Int
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> a -> Sum Int
forall a. Enum a => a -> a -> Sum Int
rangeSize) [(a, a)]
xs
member :: Ord a => a -> RSet a -> Bool
member :: forall a. Ord a => a -> RSet a -> Bool
member a
x (RSet [(a, a)]
xs) = [(a, a)] -> Bool
f [(a, a)]
xs where
f :: [(a, a)] -> Bool
f ((a
a,a
b):[(a, a)]
s)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
a = Bool
False
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
b = Bool
True
| Bool
otherwise = [(a, a)] -> Bool
f [(a, a)]
s
f [] = Bool
False
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 [(a, a)]
xs) = Maybe a -> [(a, a)] -> Maybe a
f Maybe a
forall a. Maybe a
Nothing [(a, a)]
xs where
f :: Maybe a -> [(a, a)] -> Maybe a
f Maybe a
l ((a
a,a
b):[(a, a)]
s)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
a = Maybe a
l
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
b Bool -> Bool -> Bool
|| a -> a
forall a. Enum a => a -> a
pred a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
b = a -> Maybe a
forall a. a -> Maybe a
Just (a -> a
forall a. Enum a => a -> a
pred a
x)
| Bool
otherwise = Maybe a -> [(a, a)] -> Maybe a
f (a -> Maybe a
forall a. a -> Maybe a
Just a
b) [(a, a)]
s
f Maybe a
l [] = Maybe a
l
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 [(a, a)]
xs) = [(a, a)] -> Maybe a
f [(a, a)]
xs where
f :: [(a, a)] -> Maybe a
f ((a
a,a
b):[(a, a)]
s)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
a = a -> Maybe a
forall a. a -> Maybe a
Just a
a
| 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)] -> Maybe a
f [(a, a)]
s
f [] = Maybe a
forall a. Maybe a
Nothing
lookupLE :: Ord a => a -> RSet a -> Maybe a
lookupLE :: forall a. Ord a => a -> RSet a -> Maybe a
lookupLE a
x (RSet [(a, a)]
xs) = Maybe a -> [(a, a)] -> Maybe a
f Maybe a
forall a. Maybe a
Nothing [(a, a)]
xs where
f :: Maybe a -> [(a, a)] -> Maybe a
f Maybe a
l ((a
a,a
b):[(a, a)]
s)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
a = Maybe a
l
| 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 = Maybe a -> [(a, a)] -> Maybe a
f (a -> Maybe a
forall a. a -> Maybe a
Just a
b) [(a, a)]
s
f Maybe a
l [] = Maybe a
l
lookupGE :: Ord a => a -> RSet a -> Maybe a
lookupGE :: forall a. Ord a => a -> RSet a -> Maybe a
lookupGE a
x (RSet [(a, a)]
xs) = [(a, a)] -> Maybe a
f [(a, a)]
xs where
f :: [(a, a)] -> Maybe a
f ((a
a,a
b):[(a, a)]
s)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
a = a -> Maybe a
forall a. a -> Maybe a
Just a
a
| 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)] -> Maybe a
f [(a, a)]
s
f [] = Maybe a
forall a. Maybe a
Nothing
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, a)]
xs)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y = Maybe [(a, a)] -> Bool
forall a. Maybe a -> Bool
isJust (Maybe [(a, a)] -> Bool) -> Maybe [(a, a)] -> Bool
forall a b. (a -> b) -> a -> b
$ a -> a -> [(a, a)] -> Maybe [(a, a)]
forall a. Ord a => a -> a -> [(a, a)] -> Maybe [(a, a)]
rangeIsSubsetList a
x a
y [(a, a)]
xs
| 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, a)]
xs) (RSet [(a, a)]
ys) = [(a, a)] -> [(a, a)] -> Bool
forall a. Ord a => [(a, a)] -> [(a, a)] -> Bool
isSubsetRangeList [(a, a)]
xs [(a, a)]
ys
empty :: RSet a
empty :: forall a. RSet a
empty = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet []
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 = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet [(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
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 (RSet [(a, a)]
xs) = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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
x [(a, a)]
xs
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) set :: RSet a
set@(RSet [(a, a)]
xs)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y = RSet a
set
| Bool
otherwise = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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)]
xs
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 (RSet [(a, a)]
xs) = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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)]
deleteRangeList a
x a
x [(a, a)]
xs
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) set :: RSet a
set@(RSet [(a, a)]
xs)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y = RSet a
set
| Bool
otherwise = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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)]
deleteRangeList a
x a
y [(a, a)]
xs
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, a)]
xs) (RSet [(a, a)]
ys) = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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 [(a, a)]
xs [(a, a)]
ys
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, a)]
xs) (RSet [(a, a)]
ys) = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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 [(a, a)]
xs [(a, a)]
ys
intersection :: (Ord a) => RSet a -> RSet a -> RSet a
intersection :: forall a. Ord a => RSet a -> RSet a -> RSet a
intersection (RSet [(a, a)]
xs) (RSet [(a, a)]
ys) = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(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 [(a, a)]
xs [(a, a)]
ys
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 (RSet [(a, a)]
xs) = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ([(a, a)] -> RSet a) -> [(a, a)] -> RSet a
forall a b. (a -> b) -> a -> b
$ [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a, Bounded a) => [(a, a)] -> [(a, a)]
complementRangeList [(a, a)]
xs
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 [(a, a)]
xs) = [(a, a)] -> (RSet a, Bool, RSet a)
f [(a, a)]
xs where
f :: [(a, a)] -> (RSet a, Bool, RSet a)
f s :: [(a, a)]
s@(r :: (a, a)
r@(a
a,a
b):[(a, a)]
s') = case a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
x a
a of
Ordering
LT -> (RSet a
forall a. RSet a
empty, Bool
False, [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet [(a, a)]
s)
Ordering
EQ -> (RSet a
forall a. RSet a
empty, Bool
True, [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet [(a, a)]
xs')
Ordering
GT
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
b -> ([(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet [(a
a, a -> a
forall a. Enum a => a -> a
pred a
x)], Bool
True, [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet [(a, a)]
xs')
| Bool
otherwise -> (a, a) -> (RSet a, Bool, RSet a) -> (RSet a, Bool, RSet a)
forall {a} {b} {a}.
(a, a) -> (RSet a, b, RSet a) -> (RSet a, b, RSet a)
push (a, a)
r ((RSet a, Bool, RSet a) -> (RSet a, Bool, RSet a))
-> (RSet a, Bool, RSet a) -> (RSet a, Bool, RSet a)
forall a b. (a -> b) -> a -> b
$ [(a, a)] -> (RSet a, Bool, RSet a)
f [(a, a)]
s'
where
xs' :: [(a, a)]
xs'
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
b = (a -> a
forall a. Enum a => a -> a
succ a
x,a
b)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a, a)]
s'
| Bool
otherwise = [(a, a)]
s'
f [] = (RSet a
forall a. RSet a
empty, Bool
False, RSet a
forall a. RSet a
empty)
push :: (a, a) -> (RSet a, b, RSet a) -> (RSet a, b, RSet a)
push (a, a)
r (RSet [(a, a)]
ls, b
b, RSet [(a, a)]
rs) = ([(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet ((a, a)
r(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a, a)]
ls), b
b, [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet [(a, a)]
rs)
findMin :: RSet a -> a
findMin :: forall a. RSet a -> a
findMin (RSet ((a
x, a
_) : [(a, a)]
_)) = a
x
findMin RSet a
_ = String -> a
forall a. HasCallStack => String -> a
error String
"RangeSet.List.findMin: empty set"
findMax :: RSet a -> a
findMax :: forall a. RSet a -> a
findMax (RSet [(a, a)]
rs) = [(a, a)] -> a
forall {a} {b}. [(a, b)] -> b
findMax' [(a, a)]
rs
where findMax' :: [(a, b)] -> b
findMax' [(a
_, b
x)] = b
x
findMax' ((a, b)
_:[(a, b)]
xs) = [(a, b)] -> b
findMax' [(a, b)]
xs
findMax' [(a, b)]
_ = String -> b
forall a. HasCallStack => String -> a
error String
"RangeSet.List.findMax: empty set"
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 [(a, a)]
xs) = ((a, a) -> [a]) -> [(a, a)] -> [a]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((a -> a -> [a]) -> (a, a) -> [a]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> a -> [a]
forall a. Enum a => a -> a -> [a]
enumFromTo) [(a, a)]
xs
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
RSet ([(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
RSet ([(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 a -> [a]
forall a. Enum a => RSet a -> [a]
toList
toRangeList :: RSet a -> [(a, a)]
toRangeList :: forall a. RSet a -> [(a, a)]
toRangeList (RSet [(a, a)]
xs) = [(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
RSet ([(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
toSet :: Enum a => RSet a -> Set.Set a
toSet :: forall a. Enum a => RSet a -> Set a
toSet = [a] -> Set a
forall a. [a] -> Set a
Set.fromDistinctAscList ([a] -> Set a) -> (RSet a -> [a]) -> RSet a -> Set a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RSet a -> [a]
forall a. Enum a => RSet a -> [a]
toAscList
fromNormalizedRangeList :: [(a, a)] -> RSet a
fromNormalizedRangeList :: forall a. [(a, a)] -> RSet a
fromNormalizedRangeList = [(a, a)] -> RSet a
forall a. [(a, a)] -> RSet a
RSet
valid :: (Ord a, Enum a, Bounded a) => RSet a -> Bool
valid :: forall a. (Ord a, Enum a, Bounded a) => RSet a -> Bool
valid (RSet [(a, a)]
xs) = [(a, a)] -> Bool
forall a. (Ord a, Enum a, Bounded a) => [(a, a)] -> Bool
validRangeList [(a, a)]
xs