{-# LANGUAGE Safe #-}
module Data.Ranges (
Range(..),
Bound(..),
BoundType(..),
Ranges(unRanges),
(+=+),
(+=*),
(*=+),
(*=*),
lbi,
lbe,
ubi,
ube,
inf,
inRange,
aboveRange,
belowRange,
rangesOverlap,
rangesAdjoin,
inRanges,
aboveRanges,
belowRanges,
mergeRanges,
union,
intersection,
difference,
invert,
fromRanges,
joinRanges
) where
import Control.DeepSeq (NFData, rnf)
import Data.Range.Data
import Data.Range.Util
( againstLowerBound, againstUpperBound, boundIsBetween, boundsOverlapType
, invertBound, takeEvenly
)
import Data.Range.RangeInternal
( loadRanges, exportRangeMerge, joinRM, buildSpanQuery
, RangeMerge(..)
)
import qualified Data.Range.Operators as Op
import qualified Data.Range.Algebra as Alg
buildQuery :: Ord a => [Range a] -> a -> Bool
buildQuery :: forall a. Ord a => [Range a] -> a -> Bool
buildQuery [Range a]
rs = case [Range a] -> RangeMerge a
forall a. Ord a => [Range a] -> RangeMerge a
loadRanges [Range a]
rs of
RangeMerge a
IRM -> Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True
RM Maybe (Bound a)
lb Maybe (Bound a)
ub [(Bound a, Bound a)]
spans -> Maybe (Bound a)
-> Maybe (Bound a) -> [(Bound a, Bound a)] -> a -> Bool
forall a.
Ord a =>
Maybe (Bound a)
-> Maybe (Bound a) -> [(Bound a, Bound a)] -> a -> Bool
buildSpanQuery Maybe (Bound a)
lb Maybe (Bound a)
ub [(Bound a, Bound a)]
spans
buildAboveQuery :: Ord a => [Range a] -> a -> Bool
buildAboveQuery :: forall a. Ord a => [Range a] -> a -> Bool
buildAboveQuery [] = Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True
buildAboveQuery [Range a]
rs = Range a -> a -> Bool
forall a. Ord a => Range a -> a -> Bool
aboveRange ([Range a] -> Range a
forall a. HasCallStack => [a] -> a
last [Range a]
rs)
buildBelowQuery :: Ord a => [Range a] -> a -> Bool
buildBelowQuery :: forall a. Ord a => [Range a] -> a -> Bool
buildBelowQuery [] = Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True
buildBelowQuery (Range a
r:[Range a]
_) = Range a -> a -> Bool
forall a. Ord a => Range a -> a -> Bool
belowRange Range a
r
mkRanges :: Ord a => [Range a] -> Ranges a
mkRanges :: forall a. Ord a => [Range a] -> Ranges a
mkRanges [Range a]
xs =
let canonical :: [Range a]
canonical = Algebra RangeExpr [Range a]
forall a. RangeAlgebra a => Algebra RangeExpr a
Alg.eval Algebra RangeExpr [Range a] -> Algebra RangeExpr [Range a]
forall a b. (a -> b) -> a -> b
$ RangeExpr [Range a] -> RangeExpr [Range a] -> RangeExpr [Range a]
forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
Alg.union ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const []) ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const [Range a]
xs)
in [Range a] -> (a -> Bool) -> (a -> Bool) -> (a -> Bool) -> Ranges a
forall a.
[Range a] -> (a -> Bool) -> (a -> Bool) -> (a -> Bool) -> Ranges a
Ranges [Range a]
canonical ([Range a] -> a -> Bool
forall a. Ord a => [Range a] -> a -> Bool
buildQuery [Range a]
canonical) ([Range a] -> a -> Bool
forall a. Ord a => [Range a] -> a -> Bool
buildAboveQuery [Range a]
canonical) ([Range a] -> a -> Bool
forall a. Ord a => [Range a] -> a -> Bool
buildBelowQuery [Range a]
canonical)
data Ranges a = Ranges
{ forall a. Ranges a -> [Range a]
unRanges :: [Range a]
, forall a. Ranges a -> a -> Bool
_rangesQuery :: a -> Bool
, forall a. Ranges a -> a -> Bool
_aboveQuery :: a -> Bool
, forall a. Ranges a -> a -> Bool
_belowQuery :: a -> Bool
}
instance Eq a => Eq (Ranges a) where
Ranges a
a == :: Ranges a -> Ranges a -> Bool
== Ranges a
b = Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
a [Range a] -> [Range a] -> Bool
forall a. Eq a => a -> a -> Bool
== Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
b
instance Show a => Show (Ranges a) where
showsPrec :: Int -> Ranges a -> ShowS
showsPrec Int
i Ranges a
r = Bool -> ShowS -> ShowS
showParen (Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ (String
"Ranges " String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Range a] -> ShowS
forall a. Show a => a -> ShowS
shows (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
r)
instance NFData a => NFData (Ranges a) where
rnf :: Ranges a -> ()
rnf Ranges a
r = [Range a] -> ()
forall a. NFData a => a -> ()
rnf (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
r)
instance Ord a => Semigroup (Ranges a) where
<> :: Ranges a -> Ranges a -> Ranges a
(<>) Ranges a
a Ranges a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
a [Range a] -> [Range a] -> [Range a]
forall a. [a] -> [a] -> [a]
++ Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
b)
instance (Ord a) => Alg.RangeAlgebra (Ranges a) where
eval :: Algebra RangeExpr (Ranges a)
eval RangeExpr (Ranges a)
expr = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges (Algebra RangeExpr [Range a]
forall a. RangeAlgebra a => Algebra RangeExpr a
Alg.eval ((Ranges a -> [Range a])
-> RangeExpr (Ranges a) -> RangeExpr [Range a]
forall a b. (a -> b) -> RangeExpr a -> RangeExpr b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges RangeExpr (Ranges a)
expr))
instance Ord a => Monoid (Ranges a) where
mempty :: Ranges a
mempty = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges []
mconcat :: [Ranges a] -> Ranges a
mconcat = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a)
-> ([Ranges a] -> [Range a]) -> [Ranges a] -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Ranges a -> [Range a]) -> [Ranges a] -> [Range a]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges
(+=+) :: Ord a => a -> a -> Ranges a
+=+ :: forall a. Ord a => a -> a -> Ranges a
(+=+) a
a a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges [a -> a -> Range a
forall a. a -> a -> Range a
(Op.+=+) a
a a
b]
(+=*) :: Ord a => a -> a -> Ranges a
+=* :: forall a. Ord a => a -> a -> Ranges a
(+=*) a
a a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges [a -> a -> Range a
forall a. a -> a -> Range a
(Op.+=*) a
a a
b]
(*=+) :: Ord a => a -> a -> Ranges a
*=+ :: forall a. Ord a => a -> a -> Ranges a
(*=+) a
a a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges [a -> a -> Range a
forall a. a -> a -> Range a
(Op.*=+) a
a a
b]
(*=*) :: Ord a => a -> a -> Ranges a
*=* :: forall a. Ord a => a -> a -> Ranges a
(*=*) a
a a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges [a -> a -> Range a
forall a. a -> a -> Range a
(Op.*=*) a
a a
b]
lbi :: Ord a => a -> Ranges a
lbi :: forall a. Ord a => a -> Ranges a
lbi = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> (a -> [Range a]) -> a -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Range a -> [Range a] -> [Range a]
forall a. a -> [a] -> [a]
:[]) (Range a -> [Range a]) -> (a -> Range a) -> a -> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Range a
forall a. a -> Range a
Op.lbi
lbe :: Ord a => a -> Ranges a
lbe :: forall a. Ord a => a -> Ranges a
lbe = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> (a -> [Range a]) -> a -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Range a -> [Range a] -> [Range a]
forall a. a -> [a] -> [a]
:[]) (Range a -> [Range a]) -> (a -> Range a) -> a -> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Range a
forall a. a -> Range a
Op.lbe
ubi :: Ord a => a -> Ranges a
ubi :: forall a. Ord a => a -> Ranges a
ubi = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> (a -> [Range a]) -> a -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Range a -> [Range a] -> [Range a]
forall a. a -> [a] -> [a]
:[]) (Range a -> [Range a]) -> (a -> Range a) -> a -> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Range a
forall a. a -> Range a
Op.ubi
ube :: Ord a => a -> Ranges a
ube :: forall a. Ord a => a -> Ranges a
ube = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> (a -> [Range a]) -> a -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Range a -> [Range a] -> [Range a]
forall a. a -> [a] -> [a]
:[]) (Range a -> [Range a]) -> (a -> Range a) -> a -> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Range a
forall a. a -> Range a
Op.ube
inf :: Ord a => Ranges a
inf :: forall a. Ord a => Ranges a
inf = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges [Range a
forall a. Range a
Op.inf]
inRange :: Ord a => Range a -> a -> Bool
inRange :: forall a. Ord a => Range a -> a -> Bool
inRange (SingletonRange a
a) a
value = a
value a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a
inRange (SpanRange Bound a
x Bound a
y) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> (Bound a, Bound a) -> OverlapType
forall a. Ord a => Bound a -> (Bound a, Bound a) -> OverlapType
boundIsBetween (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) (Bound a
x, Bound a
y)
inRange (LowerBoundRange Bound a
lower) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstLowerBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) Bound a
lower
inRange (UpperBoundRange Bound a
upper) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstUpperBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) Bound a
upper
inRange Range a
InfiniteRange a
_ = Bool
True
aboveRange :: Ord a => Range a -> a -> Bool
aboveRange :: forall a. Ord a => Range a -> a -> Bool
aboveRange (SingletonRange a
a) a
value = a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
a
aboveRange (SpanRange Bound a
_ Bound a
y) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstLowerBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) (Bound a -> Bound a
forall a. Bound a -> Bound a
invertBound Bound a
y)
aboveRange (LowerBoundRange Bound a
_) a
_ = Bool
False
aboveRange (UpperBoundRange Bound a
upper) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstLowerBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) (Bound a -> Bound a
forall a. Bound a -> Bound a
invertBound Bound a
upper)
aboveRange Range a
InfiniteRange a
_ = Bool
False
belowRange :: Ord a => Range a -> a -> Bool
belowRange :: forall a. Ord a => Range a -> a -> Bool
belowRange (SingletonRange a
a) a
value = a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
a
belowRange (SpanRange Bound a
x Bound a
_) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstUpperBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) (Bound a -> Bound a
forall a. Bound a -> Bound a
invertBound Bound a
x)
belowRange (LowerBoundRange Bound a
lower) a
value = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstUpperBound (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
value BoundType
Inclusive) (Bound a -> Bound a
forall a. Bound a -> Bound a
invertBound Bound a
lower)
belowRange (UpperBoundRange Bound a
_) a
_ = Bool
False
belowRange Range a
InfiniteRange a
_ = Bool
False
rangesOverlap :: Ord a => Range a -> Range a -> Bool
rangesOverlap :: forall a. Ord a => Range a -> Range a -> Bool
rangesOverlap Range a
a Range a
b = OverlapType
Overlap OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Range a -> Range a -> OverlapType
forall a. Ord a => Range a -> Range a -> OverlapType
rangesOverlapType Range a
a Range a
b
rangesAdjoin :: Ord a => Range a -> Range a -> Bool
rangesAdjoin :: forall a. Ord a => Range a -> Range a -> Bool
rangesAdjoin Range a
a Range a
b = OverlapType
Adjoin OverlapType -> OverlapType -> Bool
forall a. Eq a => a -> a -> Bool
== Range a -> Range a -> OverlapType
forall a. Ord a => Range a -> Range a -> OverlapType
rangesOverlapType Range a
a Range a
b
rangesOverlapType :: Ord a => Range a -> Range a -> OverlapType
rangesOverlapType :: forall a. Ord a => Range a -> Range a -> OverlapType
rangesOverlapType (SingletonRange a
a) Range a
x =
Range a -> Range a -> OverlapType
forall a. Ord a => Range a -> Range a -> OverlapType
rangesOverlapType (Bound a -> Bound a -> Range a
forall a. Bound a -> Bound a -> Range a
SpanRange (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
a BoundType
Inclusive) (a -> BoundType -> Bound a
forall a. a -> BoundType -> Bound a
Bound a
a BoundType
Inclusive)) Range a
x
rangesOverlapType (SpanRange Bound a
x Bound a
y) (SpanRange Bound a
a Bound a
b) = (Bound a, Bound a) -> (Bound a, Bound a) -> OverlapType
forall a.
Ord a =>
(Bound a, Bound a) -> (Bound a, Bound a) -> OverlapType
boundsOverlapType (Bound a
x, Bound a
y) (Bound a
a, Bound a
b)
rangesOverlapType (SpanRange Bound a
_ Bound a
y) (LowerBoundRange Bound a
lower) = Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstLowerBound Bound a
y Bound a
lower
rangesOverlapType (SpanRange Bound a
x Bound a
_) (UpperBoundRange Bound a
upper) = Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstUpperBound Bound a
x Bound a
upper
rangesOverlapType (LowerBoundRange Bound a
_) (LowerBoundRange Bound a
_) = OverlapType
Overlap
rangesOverlapType (LowerBoundRange Bound a
lo) (UpperBoundRange Bound a
up) = Bound a -> Bound a -> OverlapType
forall a. Ord a => Bound a -> Bound a -> OverlapType
againstUpperBound Bound a
lo Bound a
up
rangesOverlapType (UpperBoundRange Bound a
_) (UpperBoundRange Bound a
_) = OverlapType
Overlap
rangesOverlapType Range a
InfiniteRange Range a
_ = OverlapType
Overlap
rangesOverlapType Range a
a Range a
b = Range a -> Range a -> OverlapType
forall a. Ord a => Range a -> Range a -> OverlapType
rangesOverlapType Range a
b Range a
a
inRanges :: Ord a => Ranges a -> a -> Bool
inRanges :: forall a. Ord a => Ranges a -> a -> Bool
inRanges = Ranges a -> a -> Bool
forall a. Ranges a -> a -> Bool
_rangesQuery
aboveRanges :: Ord a => Ranges a -> a -> Bool
aboveRanges :: forall a. Ord a => Ranges a -> a -> Bool
aboveRanges = Ranges a -> a -> Bool
forall a. Ranges a -> a -> Bool
_aboveQuery
belowRanges :: Ord a => Ranges a -> a -> Bool
belowRanges :: forall a. Ord a => Ranges a -> a -> Bool
belowRanges = Ranges a -> a -> Bool
forall a. Ranges a -> a -> Bool
_belowQuery
mergeRanges :: Ord a => [Range a] -> Ranges a
mergeRanges :: forall a. Ord a => [Range a] -> Ranges a
mergeRanges = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges
union :: Ord a => Ranges a -> Ranges a -> Ranges a
union :: forall a. Ord a => Ranges a -> Ranges a -> Ranges a
union Ranges a
a Ranges a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> [Range a] -> Ranges a
forall a b. (a -> b) -> a -> b
$ Algebra RangeExpr [Range a]
forall a. RangeAlgebra a => Algebra RangeExpr a
Alg.eval Algebra RangeExpr [Range a] -> Algebra RangeExpr [Range a]
forall a b. (a -> b) -> a -> b
$
RangeExpr [Range a] -> RangeExpr [Range a] -> RangeExpr [Range a]
forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
Alg.union ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
a)) ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
b))
intersection :: Ord a => Ranges a -> Ranges a -> Ranges a
intersection :: forall a. Ord a => Ranges a -> Ranges a -> Ranges a
intersection Ranges a
a Ranges a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> [Range a] -> Ranges a
forall a b. (a -> b) -> a -> b
$ Algebra RangeExpr [Range a]
forall a. RangeAlgebra a => Algebra RangeExpr a
Alg.eval Algebra RangeExpr [Range a] -> Algebra RangeExpr [Range a]
forall a b. (a -> b) -> a -> b
$
RangeExpr [Range a] -> RangeExpr [Range a] -> RangeExpr [Range a]
forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
Alg.intersection ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
a)) ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
b))
difference :: Ord a => Ranges a -> Ranges a -> Ranges a
difference :: forall a. Ord a => Ranges a -> Ranges a -> Ranges a
difference Ranges a
a Ranges a
b = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a) -> [Range a] -> Ranges a
forall a b. (a -> b) -> a -> b
$ Algebra RangeExpr [Range a]
forall a. RangeAlgebra a => Algebra RangeExpr a
Alg.eval Algebra RangeExpr [Range a] -> Algebra RangeExpr [Range a]
forall a b. (a -> b) -> a -> b
$
RangeExpr [Range a] -> RangeExpr [Range a] -> RangeExpr [Range a]
forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
Alg.difference ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
a)) ([Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const (Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges Ranges a
b))
invert :: Ord a => Ranges a -> Ranges a
invert :: forall a. Ord a => Ranges a -> Ranges a
invert = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a)
-> (Ranges a -> [Range a]) -> Ranges a -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Algebra RangeExpr [Range a]
forall a. RangeAlgebra a => Algebra RangeExpr a
Alg.eval Algebra RangeExpr [Range a]
-> (Ranges a -> RangeExpr [Range a]) -> Ranges a -> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExpr [Range a] -> RangeExpr [Range a]
forall a. RangeExpr a -> RangeExpr a
Alg.invert (RangeExpr [Range a] -> RangeExpr [Range a])
-> (Ranges a -> RangeExpr [Range a])
-> Ranges a
-> RangeExpr [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Range a] -> RangeExpr [Range a]
forall a. a -> RangeExpr a
Alg.const ([Range a] -> RangeExpr [Range a])
-> (Ranges a -> [Range a]) -> Ranges a -> RangeExpr [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges
fromRanges :: (Ord a, Enum a) => Ranges a -> [a]
fromRanges :: forall a. (Ord a, Enum a) => Ranges a -> [a]
fromRanges = [[a]] -> [a]
forall a. [[a]] -> [a]
takeEvenly ([[a]] -> [a]) -> (Ranges a -> [[a]]) -> Ranges a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Range a -> [a]) -> [Range a] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Range a -> [a]
forall {a}. Enum a => Range a -> [a]
fromRange ([Range a] -> [[a]])
-> (Ranges a -> [Range a]) -> Ranges a -> [[a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges
where
fromRange :: Range a -> [a]
fromRange (SingletonRange a
x) = [a
x]
fromRange (SpanRange (Bound a
a BoundType
aType) (Bound a
b BoundType
bType)) =
[ (if BoundType
aType BoundType -> BoundType -> Bool
forall a. Eq a => a -> a -> Bool
== BoundType
Inclusive then a
a else a -> a
forall a. Enum a => a -> a
succ a
a)
.. (if BoundType
bType BoundType -> BoundType -> Bool
forall a. Eq a => a -> a -> Bool
== BoundType
Inclusive then a
b else a -> a
forall a. Enum a => a -> a
pred a
b) ]
fromRange (LowerBoundRange (Bound a
x BoundType
xType)) =
(a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate a -> a
forall a. Enum a => a -> a
succ (if BoundType
xType BoundType -> BoundType -> Bool
forall a. Eq a => a -> a -> Bool
== BoundType
Inclusive then a
x else a -> a
forall a. Enum a => a -> a
succ a
x)
fromRange (UpperBoundRange (Bound a
x BoundType
xType)) =
(a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate a -> a
forall a. Enum a => a -> a
pred (if BoundType
xType BoundType -> BoundType -> Bool
forall a. Eq a => a -> a -> Bool
== BoundType
Inclusive then a
x else a -> a
forall a. Enum a => a -> a
pred a
x)
fromRange Range a
InfiniteRange =
a
zero a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [[a]] -> [a]
forall a. [[a]] -> [a]
takeEvenly [(a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate a -> a
forall a. Enum a => a -> a
succ (a -> a
forall a. Enum a => a -> a
succ a
zero), (a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate a -> a
forall a. Enum a => a -> a
pred (a -> a
forall a. Enum a => a -> a
pred a
zero)]
where zero :: a
zero = Int -> a
forall a. Enum a => Int -> a
toEnum Int
0
joinRanges :: (Ord a, Enum a) => Ranges a -> Ranges a
joinRanges :: forall a. (Ord a, Enum a) => Ranges a -> Ranges a
joinRanges = [Range a] -> Ranges a
forall a. Ord a => [Range a] -> Ranges a
mkRanges ([Range a] -> Ranges a)
-> (Ranges a -> [Range a]) -> Ranges a -> Ranges a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeMerge a -> [Range a]
forall a. Eq a => RangeMerge a -> [Range a]
exportRangeMerge (RangeMerge a -> [Range a])
-> (Ranges a -> RangeMerge a) -> Ranges a -> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeMerge a -> RangeMerge a
forall a. (Eq a, Enum a) => RangeMerge a -> RangeMerge a
joinRM (RangeMerge a -> RangeMerge a)
-> (Ranges a -> RangeMerge a) -> Ranges a -> RangeMerge a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Range a] -> RangeMerge a
forall a. Ord a => [Range a] -> RangeMerge a
loadRanges ([Range a] -> RangeMerge a)
-> (Ranges a -> [Range a]) -> Ranges a -> RangeMerge a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ranges a -> [Range a]
forall a. Ranges a -> [Range a]
unRanges