{-# LANGUAGE Safe #-}
module Data.RangeSet.Internal
( rangeSize
, rangeIsSubsetList
, isSubsetRangeList
, insertRangeList
, deleteRangeList
, unionRangeList
, differenceRangeList
, intersectRangeList
, complementRangeList
, fromAscElemList
, fromElemList
, normalizeRangeList
, validRangeList
) where
import Data.List (sort)
import Data.Monoid (Sum (..))
rangeSize :: Enum a => a -> a -> Sum Int
rangeSize :: forall a. Enum a => a -> a -> Sum Int
rangeSize a
a a
b = Int -> Sum Int
forall a. a -> Sum a
Sum (Int -> Sum Int) -> Int -> Sum Int
forall a b. (a -> b) -> a -> b
$ Int -> Int
forall a. Enum a => a -> a
succ (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ a -> Int
forall a. Enum a => a -> Int
fromEnum a
b Int -> Int -> Int
forall a. Num a => a -> a -> a
- a -> Int
forall a. Enum a => a -> Int
fromEnum a
a
rangeIsSubsetList :: Ord a => a -> a -> [(a, a)] -> Maybe [(a, a)]
rangeIsSubsetList :: forall a. Ord a => a -> a -> [(a, a)] -> Maybe [(a, a)]
rangeIsSubsetList a
x a
y ((a
u,a
v):[(a, a)]
s)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u = Maybe [(a, a)]
forall a. Maybe a
Nothing
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
v = [(a, a)] -> Maybe [(a, a)]
forall a. a -> Maybe a
Just ((a
y,a
v)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a, a)]
s)
| Bool
otherwise = 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)]
s
rangeIsSubsetList a
_ a
_ [] = Maybe [(a, a)]
forall a. Maybe a
Nothing
isSubsetRangeList :: Ord a => [(a, a)] -> [(a, a)] -> Bool
isSubsetRangeList :: forall a. Ord a => [(a, a)] -> [(a, a)] -> Bool
isSubsetRangeList ((a
x,a
y):[(a, a)]
as) [(a, a)]
bs = Bool -> ([(a, a)] -> Bool) -> Maybe [(a, a)] -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False ([(a, a)] -> [(a, a)] -> Bool
forall a. Ord a => [(a, a)] -> [(a, a)] -> Bool
isSubsetRangeList [(a, a)]
as) (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)]
bs
isSubsetRangeList [] [(a, a)]
_ = Bool
True
insertRangeList :: (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
insertRangeList :: forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
insertRangeList a
x a
y set :: [(a, a)]
set@(uv :: (a, a)
uv@(a
u,a
v) : [(a, a)]
xs)
| a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x Bool -> Bool -> Bool
&& a -> a
forall a. Enum a => a -> a
succ a
v a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
x = (a, a)
uv (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: 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
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u Bool -> Bool -> Bool
&& a -> a
forall a. Enum a => a -> a
succ a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
u = (a
x,a
y) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)]
set
| Bool
otherwise = a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
prependRangeList (a -> a -> a
forall a. Ord a => a -> a -> a
min a
x a
u) (a -> a -> a
forall a. Ord a => a -> a -> a
max a
y a
v) [(a, a)]
xs
insertRangeList a
x a
y [] = [(a
x,a
y)]
prependRangeList :: (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
prependRangeList :: forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
prependRangeList a
x a
y set :: [(a, a)]
set@((a
u,a
v) : [(a, a)]
xs)
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u Bool -> Bool -> Bool
&& a -> a
forall a. Enum a => a -> a
succ a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
u = (a
x,a
y) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)]
set
| Bool
otherwise = a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
prependRangeList a
x (a -> a -> a
forall a. Ord a => a -> a -> a
max a
y a
v) [(a, a)]
xs
prependRangeList a
x a
y [] = [(a
x,a
y)]
unionRangeList :: (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
unionRangeList :: forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
unionRangeList aset :: [(a, a)]
aset@(xy :: (a, a)
xy@(a
x,a
y):[(a, a)]
as) bset :: [(a, a)]
bset@(uv :: (a, a)
uv@(a
u,a
v):[(a, a)]
bs)
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u Bool -> Bool -> Bool
&& a -> a
forall a. Enum a => a -> a
succ a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
u = (a, a)
xy (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
unionRangeList [(a, a)]
as [(a, a)]
bset
| a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x Bool -> Bool -> Bool
&& a -> a
forall a. Enum a => a -> a
succ a
v a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
x = (a, a)
uv (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
unionRangeList [(a, a)]
aset [(a, a)]
bs
| Bool
otherwise = a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
prependRangeList (a -> a -> a
forall a. Ord a => a -> a -> a
min a
x a
u) (a -> a -> a
forall a. Ord a => a -> a -> a
max a
y a
v) ([(a, a)] -> [(a, a)]) -> [(a, a)] -> [(a, 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)]
as [(a, a)]
bs
unionRangeList [(a, a)]
s [] = [(a, a)]
s
unionRangeList [] [(a, a)]
s = [(a, a)]
s
deleteRangeList :: (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
deleteRangeList :: forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
deleteRangeList a
x a
y set :: [(a, a)]
set@(s :: (a, a)
s@(a
u,a
v) : [(a, a)]
xs)
| a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x = (a, a)
s (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: 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
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u = [(a, a)]
set
| 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) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)]
t
| Bool
otherwise = [(a, a)]
t where
t :: [(a, a)]
t = a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
trimRangeList' a
y a
v [(a, a)]
xs
deleteRangeList a
_ a
_ [] = []
trimRangeList' :: (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
trimRangeList' :: forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
trimRangeList' a
y a
v [(a, a)]
xs
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
v = (a -> a
forall a. Enum a => a -> a
succ a
y, a
v) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)]
xs
| Bool
otherwise = a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> [(a, a)] -> [(a, a)]
trimRangeList a
y [(a, a)]
xs
trimRangeList :: (Ord a, Enum a) => a -> [(a, a)] -> [(a, a)]
trimRangeList :: forall a. (Ord a, Enum a) => a -> [(a, a)] -> [(a, a)]
trimRangeList a
y set :: [(a, a)]
set@((a
u,a
v) : [(a, a)]
xs)
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u = [(a, a)]
set
| Bool
otherwise = a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
trimRangeList' a
y a
v [(a, a)]
xs
trimRangeList a
_ [] = []
differenceRangeList :: (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
differenceRangeList :: forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
differenceRangeList aset :: [(a, a)]
aset@(xy :: (a, a)
xy@(a
x,a
y):[(a, a)]
as) bset :: [(a, a)]
bset@((a
u,a
v):[(a, a)]
bs)
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u = (a, a)
xy (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
differenceRangeList [(a, a)]
as [(a, a)]
bset
| a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x = [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
differenceRangeList [(a, a)]
aset [(a, a)]
bs
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u = (a
x, a -> a
forall a. Enum a => a -> a
pred a
u) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)]
t
| Bool
otherwise = [(a, a)]
t where
t :: [(a, a)]
t = [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)] -> [(a, a)]
differenceRangeList (a -> a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => a -> a -> [(a, a)] -> [(a, a)]
trimRangeList' a
v a
y [(a, a)]
as) [(a, a)]
bs
differenceRangeList [(a, a)]
s [] = [(a, a)]
s
differenceRangeList [] [(a, a)]
_ = []
intersectRangeList :: Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList :: forall a. Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList aset :: [(a, a)]
aset@((a
x,a
y):[(a, a)]
as) bset :: [(a, a)]
bset@((a
u,a
v):[(a, a)]
bs)
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
u = [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList [(a, a)]
as [(a, a)]
bset
| a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x = [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList [(a, a)]
aset [(a, a)]
bs
| a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
v = (a -> a -> a
forall a. Ord a => a -> a -> a
max a
x a
u, a
y) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList [(a, a)]
as [(a, a)]
bset
| Bool
otherwise = (a -> a -> a
forall a. Ord a => a -> a -> a
max a
x a
u, a
v) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)] -> [(a, a)]
forall a. Ord a => [(a, a)] -> [(a, a)] -> [(a, a)]
intersectRangeList [(a, a)]
aset [(a, a)]
bs
intersectRangeList [(a, a)]
_ [] = []
intersectRangeList [] [(a, a)]
_ = []
complementRangeList' :: (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList' :: forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList' a
x ((a
u,a
v):[(a, a)]
s) = (a
x,a -> a
forall a. Enum a => a -> a
pred a
u) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList'' a
v [(a, a)]
s
complementRangeList' a
x [] = [(a
x,a
forall a. Bounded a => a
maxBound)]
complementRangeList'' :: (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList'' :: forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList'' a
x [(a, a)]
s
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
forall a. Bounded a => a
maxBound = []
| Bool
otherwise = a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList' (a -> a
forall a. Enum a => a -> a
succ a
x) [(a, a)]
s
complementRangeList :: (Ord a, Enum a, Bounded a) => [(a, a)] -> [(a, a)]
complementRangeList :: forall a. (Ord a, Enum a, Bounded a) => [(a, a)] -> [(a, a)]
complementRangeList s :: [(a, a)]
s@((a
x,a
y):[(a, a)]
s')
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
forall a. Bounded a => a
minBound = a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList'' a
y [(a, a)]
s'
| Bool
otherwise = a -> [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> [(a, a)]
complementRangeList' a
forall a. Bounded a => a
minBound [(a, a)]
s
complementRangeList [] = [(a
forall a. Bounded a => a
minBound, a
forall a. Bounded a => a
maxBound)]
takeWhileAdj :: (Eq a, Enum a) => a -> [a] -> (a, [a])
takeWhileAdj :: forall a. (Eq a, Enum a) => a -> [a] -> (a, [a])
takeWhileAdj a
x yl :: [a]
yl@(a
y:[a]
l)
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y Bool -> Bool -> Bool
|| a -> a
forall a. Enum a => a -> a
succ a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y = a -> [a] -> (a, [a])
forall a. (Eq a, Enum a) => a -> [a] -> (a, [a])
takeWhileAdj a
y [a]
l
| Bool
otherwise = (a
x, [a]
yl)
takeWhileAdj a
x [] = (a
x, [])
takeWhileRangeAdj :: (Ord a, Enum a) => a -> [(a,a)] -> (a, [(a,a)])
takeWhileRangeAdj :: forall a. (Ord a, Enum a) => a -> [(a, a)] -> (a, [(a, a)])
takeWhileRangeAdj a
x yzl :: [(a, a)]
yzl@((a
y,a
z):[(a, a)]
l)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
y Bool -> Bool -> Bool
|| a -> a
forall a. Enum a => a -> a
succ a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y = a -> [(a, a)] -> (a, [(a, a)])
forall a. (Ord a, Enum a) => a -> [(a, a)] -> (a, [(a, a)])
takeWhileRangeAdj (a -> a -> a
forall a. Ord a => a -> a -> a
max a
x a
z) [(a, a)]
l
| Bool
otherwise = (a
x, [(a, a)]
yzl)
takeWhileRangeAdj a
x [] = (a
x, [])
fromAscElemList :: (Eq a, Enum a) => [a] -> [(a, a)]
fromAscElemList :: forall a. (Eq a, Enum a) => [a] -> [(a, a)]
fromAscElemList (a
x:[a]
l) = (a
x, a
y) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [a] -> [(a, a)]
forall a. (Eq a, Enum a) => [a] -> [(a, a)]
fromAscElemList [a]
l' where
(a
y, [a]
l') = a -> [a] -> (a, [a])
forall a. (Eq a, Enum a) => a -> [a] -> (a, [a])
takeWhileAdj a
x [a]
l
fromAscElemList [] = []
fromElemList :: (Ord a, Enum a) => [a] -> [(a, a)]
fromElemList :: forall a. (Ord a, Enum a) => [a] -> [(a, a)]
fromElemList = [a] -> [(a, a)]
forall a. (Eq a, Enum a) => [a] -> [(a, a)]
fromAscElemList ([a] -> [(a, a)]) -> ([a] -> [a]) -> [a] -> [(a, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. Ord a => [a] -> [a]
sort
mergeRangeList :: (Ord a, Enum a) => [(a, a)] -> [(a, a)]
mergeRangeList :: forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)]
mergeRangeList ((a
x,a
y):[(a, a)]
l) = (a
x,a
y') (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)]
mergeRangeList [(a, a)]
l' where
(a
y', [(a, a)]
l') = a -> [(a, a)] -> (a, [(a, a)])
forall a. (Ord a, Enum a) => a -> [(a, a)] -> (a, [(a, a)])
takeWhileRangeAdj a
y [(a, a)]
l
mergeRangeList [] = []
normalizeRangeList :: (Ord a, Enum a) => [(a, a)] -> [(a, a)]
normalizeRangeList :: forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)]
normalizeRangeList = [(a, a)] -> [(a, a)]
forall a. (Ord a, Enum a) => [(a, a)] -> [(a, a)]
mergeRangeList ([(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, a)]
forall a. Ord a => [a] -> [a]
sort ([(a, a)] -> [(a, a)])
-> ([(a, a)] -> [(a, a)]) -> [(a, a)] -> [(a, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, a) -> Bool) -> [(a, a)] -> [(a, a)]
forall a. (a -> Bool) -> [a] -> [a]
filter (a, a) -> Bool
forall {a}. Ord a => (a, a) -> Bool
valid where
valid :: (a, a) -> Bool
valid (a
x,a
y) = a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y
validRangeList' :: (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> Bool
validRangeList' :: forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> Bool
validRangeList' a
b ((a
x,a
y):[(a, a)]
s) = a
b a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
forall a. Bounded a => a
maxBound Bool -> Bool -> Bool
&& a -> a
forall a. Enum a => a -> a
succ a
b a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
x Bool -> Bool -> Bool
&& a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y Bool -> Bool -> Bool
&& a -> [(a, a)] -> Bool
forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> Bool
validRangeList' a
y [(a, a)]
s
validRangeList' a
_ [] = Bool
True
validRangeList :: (Ord a, Enum a, Bounded a) => [(a, a)] -> Bool
validRangeList :: forall a. (Ord a, Enum a, Bounded a) => [(a, a)] -> Bool
validRangeList ((a
x,a
y):[(a, a)]
s) = a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y Bool -> Bool -> Bool
&& a -> [(a, a)] -> Bool
forall a. (Ord a, Enum a, Bounded a) => a -> [(a, a)] -> Bool
validRangeList' a
y [(a, a)]
s
validRangeList [] = Bool
True