{-# LANGUAGE Safe #-}
module Data.Range.Ord
(
KeyRange(..)
, SortedRange(..)
) where
import Data.Range.Data
import Data.Range.Util (compareLower, compareHigher)
newtype KeyRange a = KeyRange { forall a. KeyRange a -> Range a
unKeyRange :: Range a }
deriving (KeyRange a -> KeyRange a -> Bool
(KeyRange a -> KeyRange a -> Bool)
-> (KeyRange a -> KeyRange a -> Bool) -> Eq (KeyRange a)
forall a. Eq a => KeyRange a -> KeyRange a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => KeyRange a -> KeyRange a -> Bool
== :: KeyRange a -> KeyRange a -> Bool
$c/= :: forall a. Eq a => KeyRange a -> KeyRange a -> Bool
/= :: KeyRange a -> KeyRange a -> Bool
Eq, Int -> KeyRange a -> ShowS
[KeyRange a] -> ShowS
KeyRange a -> String
(Int -> KeyRange a -> ShowS)
-> (KeyRange a -> String)
-> ([KeyRange a] -> ShowS)
-> Show (KeyRange a)
forall a. Show a => Int -> KeyRange a -> ShowS
forall a. Show a => [KeyRange a] -> ShowS
forall a. Show a => KeyRange a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> KeyRange a -> ShowS
showsPrec :: Int -> KeyRange a -> ShowS
$cshow :: forall a. Show a => KeyRange a -> String
show :: KeyRange a -> String
$cshowList :: forall a. Show a => [KeyRange a] -> ShowS
showList :: [KeyRange a] -> ShowS
Show)
constructorRank :: Range a -> Int
constructorRank :: forall a. Range a -> Int
constructorRank (SingletonRange a
_) = Int
0
constructorRank (SpanRange Bound a
_ Bound a
_) = Int
1
constructorRank (LowerBoundRange Bound a
_) = Int
2
constructorRank (UpperBoundRange Bound a
_) = Int
3
constructorRank Range a
InfiniteRange = Int
4
compareRangeFields :: Ord a => Range a -> Range a -> Ordering
compareRangeFields :: forall a. Ord a => Range a -> Range a -> Ordering
compareRangeFields (SingletonRange a
a) (SingletonRange a
b) = a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
a a
b
compareRangeFields (SpanRange Bound a
lo1 Bound a
hi1) (SpanRange Bound a
lo2 Bound a
hi2) =
case Bound a -> Bound a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Bound a
lo1 Bound a
lo2 of
Ordering
EQ -> Bound a -> Bound a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Bound a
hi1 Bound a
hi2
Ordering
r -> Ordering
r
compareRangeFields (LowerBoundRange Bound a
a) (LowerBoundRange Bound a
b) = Bound a -> Bound a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Bound a
a Bound a
b
compareRangeFields (UpperBoundRange Bound a
a) (UpperBoundRange Bound a
b) = Bound a -> Bound a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Bound a
a Bound a
b
compareRangeFields Range a
InfiniteRange Range a
InfiniteRange = Ordering
EQ
compareRangeFields Range a
_ Range a
_ = Ordering
EQ
instance Ord a => Ord (KeyRange a) where
compare :: KeyRange a -> KeyRange a -> Ordering
compare (KeyRange Range a
x) (KeyRange Range a
y) =
case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Range a -> Int
forall a. Range a -> Int
constructorRank Range a
x) (Range a -> Int
forall a. Range a -> Int
constructorRank Range a
y) of
Ordering
EQ -> Range a -> Range a -> Ordering
forall a. Ord a => Range a -> Range a -> Ordering
compareRangeFields Range a
x Range a
y
Ordering
r -> Ordering
r
data ExtBound a = NegInfinity | FiniteBound (Bound a) | PosInfinity
compareExtBound :: (Bound a -> Bound a -> Ordering) -> ExtBound a -> ExtBound a -> Ordering
compareExtBound :: forall a.
(Bound a -> Bound a -> Ordering)
-> ExtBound a -> ExtBound a -> Ordering
compareExtBound Bound a -> Bound a -> Ordering
_ ExtBound a
NegInfinity ExtBound a
NegInfinity = Ordering
EQ
compareExtBound Bound a -> Bound a -> Ordering
_ ExtBound a
NegInfinity ExtBound a
_ = Ordering
LT
compareExtBound Bound a -> Bound a -> Ordering
_ ExtBound a
_ ExtBound a
NegInfinity = Ordering
GT
compareExtBound Bound a -> Bound a -> Ordering
_ ExtBound a
PosInfinity ExtBound a
PosInfinity = Ordering
EQ
compareExtBound Bound a -> Bound a -> Ordering
_ ExtBound a
PosInfinity ExtBound a
_ = Ordering
GT
compareExtBound Bound a -> Bound a -> Ordering
_ ExtBound a
_ ExtBound a
PosInfinity = Ordering
LT
compareExtBound Bound a -> Bound a -> Ordering
cmp (FiniteBound Bound a
a) (FiniteBound Bound a
b) = Bound a -> Bound a -> Ordering
cmp Bound a
a Bound a
b
lowerExtBound :: Range a -> ExtBound a
lowerExtBound :: forall a. Range a -> ExtBound a
lowerExtBound (UpperBoundRange Bound a
_) = ExtBound a
forall a. ExtBound a
NegInfinity
lowerExtBound Range a
InfiniteRange = ExtBound a
forall a. ExtBound a
NegInfinity
lowerExtBound (LowerBoundRange Bound a
b) = Bound a -> ExtBound a
forall a. Bound a -> ExtBound a
FiniteBound Bound a
b
lowerExtBound (SpanRange Bound a
lo Bound a
_) = Bound a -> ExtBound a
forall a. Bound a -> ExtBound a
FiniteBound Bound a
lo
lowerExtBound (SingletonRange a
x) = Bound a -> ExtBound a
forall a. Bound a -> ExtBound a
FiniteBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
x BoundType
Inclusive)
upperExtBound :: Range a -> ExtBound a
upperExtBound :: forall a. Range a -> ExtBound a
upperExtBound (LowerBoundRange Bound a
_) = ExtBound a
forall a. ExtBound a
PosInfinity
upperExtBound Range a
InfiniteRange = ExtBound a
forall a. ExtBound a
PosInfinity
upperExtBound (UpperBoundRange Bound a
b) = Bound a -> ExtBound a
forall a. Bound a -> ExtBound a
FiniteBound Bound a
b
upperExtBound (SpanRange Bound a
_ Bound a
hi) = Bound a -> ExtBound a
forall a. Bound a -> ExtBound a
FiniteBound Bound a
hi
upperExtBound (SingletonRange a
x) = Bound a -> ExtBound a
forall a. Bound a -> ExtBound a
FiniteBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
x BoundType
Inclusive)
newtype SortedRange a = SortedRange { forall a. SortedRange a -> Range a
unSortedRange :: Range a }
instance Show a => Show (SortedRange a) where
show :: SortedRange a -> String
show (SortedRange Range a
r) = String
"SortedRange (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Range a -> String
forall a. Show a => a -> String
show Range a
r String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
instance Ord a => Eq (SortedRange a) where
SortedRange a
x == :: SortedRange a -> SortedRange a -> Bool
== SortedRange a
y = SortedRange a -> SortedRange a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare SortedRange a
x SortedRange a
y Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
EQ
instance Ord a => Ord (SortedRange a) where
compare :: SortedRange a -> SortedRange a -> Ordering
compare (SortedRange Range a
a) (SortedRange Range a
b) =
case (Bound a -> Bound a -> Ordering)
-> ExtBound a -> ExtBound a -> Ordering
forall a.
(Bound a -> Bound a -> Ordering)
-> ExtBound a -> ExtBound a -> Ordering
compareExtBound Bound a -> Bound a -> Ordering
forall a. Ord a => Bound a -> Bound a -> Ordering
compareLower (Range a -> ExtBound a
forall a. Range a -> ExtBound a
lowerExtBound Range a
a) (Range a -> ExtBound a
forall a. Range a -> ExtBound a
lowerExtBound Range a
b) of
Ordering
EQ -> (Bound a -> Bound a -> Ordering)
-> ExtBound a -> ExtBound a -> Ordering
forall a.
(Bound a -> Bound a -> Ordering)
-> ExtBound a -> ExtBound a -> Ordering
compareExtBound Bound a -> Bound a -> Ordering
forall a. Ord a => Bound a -> Bound a -> Ordering
compareHigher (Range a -> ExtBound a
forall a. Range a -> ExtBound a
upperExtBound Range a
a) (Range a -> ExtBound a
forall a. Range a -> ExtBound a
upperExtBound Range a
b)
Ordering
r -> Ordering
r