{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module IntervalAlgebra.Core
(
Interval
, Intervallic(..)
, ParseErrorInterval(..)
, begin
, end
, parseInterval
, prsi
, beginerval
, bi
, enderval
, ei
, safeInterval
, si
, expand
, expandl
, expandr
, IntervalRelation(..)
, meets
, metBy
, before
, after
, overlaps
, overlappedBy
, finishedBy
, finishes
, contains
, during
, starts
, startedBy
, equals
, precedes
, precededBy
, disjoint
, notDisjoint
, concur
, within
, encloses
, enclosedBy
, (<|>)
, predicate
, unionPredicates
, disjointRelations
, withinRelations
, strictWithinRelations
, ComparativePredicateOf1
, ComparativePredicateOf2
, beginervalFromEnd
, endervalFromBegin
, beginervalMoment
, endervalMoment
, shiftFromBegin
, shiftFromEnd
, momentize
, toEnumInterval
, fromEnumInterval
, intervalRelations
, relate
, compose
, complement
, union
, intersection
, converse
, IntervalCombinable(..)
, extenterval
, IntervalSizeable(..)
) where
import Control.Applicative (Applicative (pure), liftA2)
import Control.DeepSeq (NFData)
import Data.Binary (Binary)
import Data.Fixed (Pico)
import Data.Function (flip, id, ($), (.))
import Data.Ord (Ord (..), Ordering (..), max, min)
import Data.Semigroup (Semigroup ((<>)))
import qualified Data.Set (Set, difference, fromList, intersection,
map, toList, union)
import Data.Time as DT (Day, DiffTime, NominalDiffTime,
UTCTime, addDays, addUTCTime,
diffDays, diffUTCTime,
nominalDiffTimeToSeconds,
secondsToNominalDiffTime)
import Data.Tuple (fst, snd)
import GHC.Generics (Generic)
import Prelude (Bool (..), Bounded (..), Either (..),
Enum (..), Eq, Int, Integer, Maybe (..),
Num, Rational, Show, String, any, curry,
fromInteger, fromRational, map, negate,
not, otherwise, realToFrac, replicate,
show, toInteger, toRational, (!!), (&&),
(+), (++), (-), (==))
import Test.QuickCheck (Arbitrary (..), resize, sized, suchThat)
newtype Interval a = Interval (a, a) deriving (Interval a -> Interval a -> Bool
forall a. Eq a => Interval a -> Interval a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Interval a -> Interval a -> Bool
$c/= :: forall a. Eq a => Interval a -> Interval a -> Bool
== :: Interval a -> Interval a -> Bool
$c== :: forall a. Eq a => Interval a -> Interval a -> Bool
Eq, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Interval a) x -> Interval a
forall a x. Interval a -> Rep (Interval a) x
$cto :: forall a x. Rep (Interval a) x -> Interval a
$cfrom :: forall a x. Interval a -> Rep (Interval a) x
Generic)
newtype ParseErrorInterval = ParseErrorInterval String
deriving (ParseErrorInterval -> ParseErrorInterval -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParseErrorInterval -> ParseErrorInterval -> Bool
$c/= :: ParseErrorInterval -> ParseErrorInterval -> Bool
== :: ParseErrorInterval -> ParseErrorInterval -> Bool
$c== :: ParseErrorInterval -> ParseErrorInterval -> Bool
Eq, Int -> ParseErrorInterval -> ShowS
[ParseErrorInterval] -> ShowS
ParseErrorInterval -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParseErrorInterval] -> ShowS
$cshowList :: [ParseErrorInterval] -> ShowS
show :: ParseErrorInterval -> String
$cshow :: ParseErrorInterval -> String
showsPrec :: Int -> ParseErrorInterval -> ShowS
$cshowsPrec :: Int -> ParseErrorInterval -> ShowS
Show)
isValidBeginEnd :: (Ord a) => a -> a -> Bool
isValidBeginEnd :: forall a. Ord a => a -> a -> Bool
isValidBeginEnd a
b a
e = a
b forall a. Ord a => a -> a -> Bool
< a
e
parseInterval
:: (Show a, Ord a) => a -> a -> Either ParseErrorInterval (Interval a)
parseInterval :: forall a.
(Show a, Ord a) =>
a -> a -> Either ParseErrorInterval (Interval a)
parseInterval a
x a
y
| forall a. Ord a => a -> a -> Bool
isValidBeginEnd a
x a
y = forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall a. (a, a) -> Interval a
Interval (a
x, a
y)
| Bool
otherwise = forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String -> ParseErrorInterval
ParseErrorInterval forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show a
y forall a. [a] -> [a] -> [a]
++ String
"<=" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
x
prsi :: (Show a, Ord a) => a -> a -> Either ParseErrorInterval (Interval a)
prsi :: forall a.
(Show a, Ord a) =>
a -> a -> Either ParseErrorInterval (Interval a)
prsi = forall a.
(Show a, Ord a) =>
a -> a -> Either ParseErrorInterval (Interval a)
parseInterval
intervalBegin :: Interval a -> a
intervalBegin :: forall a. Interval a -> a
intervalBegin (Interval (a, a)
x) = forall a b. (a, b) -> a
fst (a, a)
x
intervalEnd :: Interval a -> a
intervalEnd :: forall a. Interval a -> a
intervalEnd (Interval (a, a)
x) = forall a b. (a, b) -> b
snd (a, a)
x
instance (Show a, Ord a) => Show (Interval a) where
show :: Interval a -> String
show Interval a
x = String
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
x) forall a. [a] -> [a] -> [a]
++ String
", " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall (i :: * -> *) a. Intervallic i => i a -> a
end Interval a
x) forall a. [a] -> [a] -> [a]
++ String
")"
instance Binary a => Binary (Interval a)
instance NFData a => NFData (Interval a)
class Intervallic i where
getInterval :: i a -> Interval a
setInterval :: i a -> Interval b -> i b
begin, end :: (Intervallic i) => i a -> a
begin :: forall (i :: * -> *) a. Intervallic i => i a -> a
begin = forall a. Interval a -> a
intervalBegin forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval
end :: forall (i :: * -> *) a. Intervallic i => i a -> a
end = forall a. Interval a -> a
intervalEnd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval
imapStrictMonotone :: (Intervallic i) => (a -> b) -> i a -> i b
imapStrictMonotone :: forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone a -> b
f i a
i = forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
i (forall {t} {a}. (t -> a) -> Interval t -> Interval a
op a -> b
f (forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i a
i))
where op :: (t -> a) -> Interval t -> Interval a
op t -> a
f (Interval (t
b, t
e)) = forall a. (a, a) -> Interval a
Interval (t -> a
f t
b, t -> a
f t
e)
data IntervalRelation =
Before
| Meets
| Overlaps
| FinishedBy
| Contains
| Starts
| Equals
| StartedBy
| During
| Finishes
| OverlappedBy
| MetBy
| After
deriving (IntervalRelation -> IntervalRelation -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IntervalRelation -> IntervalRelation -> Bool
$c/= :: IntervalRelation -> IntervalRelation -> Bool
== :: IntervalRelation -> IntervalRelation -> Bool
$c== :: IntervalRelation -> IntervalRelation -> Bool
Eq, Int -> IntervalRelation -> ShowS
[IntervalRelation] -> ShowS
IntervalRelation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IntervalRelation] -> ShowS
$cshowList :: [IntervalRelation] -> ShowS
show :: IntervalRelation -> String
$cshow :: IntervalRelation -> String
showsPrec :: Int -> IntervalRelation -> ShowS
$cshowsPrec :: Int -> IntervalRelation -> ShowS
Show, Int -> IntervalRelation
IntervalRelation -> Int
IntervalRelation -> [IntervalRelation]
IntervalRelation -> IntervalRelation
IntervalRelation -> IntervalRelation -> [IntervalRelation]
IntervalRelation
-> IntervalRelation -> IntervalRelation -> [IntervalRelation]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: IntervalRelation
-> IntervalRelation -> IntervalRelation -> [IntervalRelation]
$cenumFromThenTo :: IntervalRelation
-> IntervalRelation -> IntervalRelation -> [IntervalRelation]
enumFromTo :: IntervalRelation -> IntervalRelation -> [IntervalRelation]
$cenumFromTo :: IntervalRelation -> IntervalRelation -> [IntervalRelation]
enumFromThen :: IntervalRelation -> IntervalRelation -> [IntervalRelation]
$cenumFromThen :: IntervalRelation -> IntervalRelation -> [IntervalRelation]
enumFrom :: IntervalRelation -> [IntervalRelation]
$cenumFrom :: IntervalRelation -> [IntervalRelation]
fromEnum :: IntervalRelation -> Int
$cfromEnum :: IntervalRelation -> Int
toEnum :: Int -> IntervalRelation
$ctoEnum :: Int -> IntervalRelation
pred :: IntervalRelation -> IntervalRelation
$cpred :: IntervalRelation -> IntervalRelation
succ :: IntervalRelation -> IntervalRelation
$csucc :: IntervalRelation -> IntervalRelation
Enum)
instance Bounded IntervalRelation where
minBound :: IntervalRelation
minBound = IntervalRelation
Before
maxBound :: IntervalRelation
maxBound = IntervalRelation
After
instance Ord IntervalRelation where
compare :: IntervalRelation -> IntervalRelation -> Ordering
compare IntervalRelation
x IntervalRelation
y = forall a. Ord a => a -> a -> Ordering
compare (forall a. Enum a => a -> Int
fromEnum IntervalRelation
x) (forall a. Enum a => a -> Int
fromEnum IntervalRelation
y)
meets, metBy
:: (Eq a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
meets :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
meets i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y
metBy :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
metBy = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
meets
before, after, precedes, precededBy
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
before :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y
after :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
after = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before
precedes :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
precedes = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before
precededBy :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
precededBy = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
after
overlaps, overlappedBy
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
overlaps :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlaps i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
begin i0 a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y Bool -> Bool -> Bool
&& forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
end i1 a
y Bool -> Bool -> Bool
&& forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Ord a => a -> a -> Bool
> forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y
overlappedBy :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlappedBy = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlaps
starts, startedBy
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
starts :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
starts i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
begin i0 a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y Bool -> Bool -> Bool
&& forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
end i1 a
y
startedBy :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
startedBy = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
starts
finishes, finishedBy
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
finishes :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishes i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
begin i0 a
x forall a. Ord a => a -> a -> Bool
> forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y Bool -> Bool -> Bool
&& forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
end i1 a
y
finishedBy :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishedBy = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishes
during, contains
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
during :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
during i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
begin i0 a
x forall a. Ord a => a -> a -> Bool
> forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y Bool -> Bool -> Bool
&& forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
end i1 a
y
contains :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
contains = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
during
equals
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
equals :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
equals i0 a
x i1 a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
begin i0 a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
begin i1 a
y Bool -> Bool -> Bool
&& forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
end i1 a
y
(<|>)
:: (Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
-> ComparativePredicateOf2 (i0 a) (i1 a)
-> ComparativePredicateOf2 (i0 a) (i1 a)
<|> :: forall (i0 :: * -> *) (i1 :: * -> *) a.
(Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
-> ComparativePredicateOf2 (i0 a) (i1 a)
-> ComparativePredicateOf2 (i0 a) (i1 a)
(<|>) ComparativePredicateOf2 (i0 a) (i1 a)
f ComparativePredicateOf2 (i0 a) (i1 a)
g = forall a b.
[ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates [ComparativePredicateOf2 (i0 a) (i1 a)
f, ComparativePredicateOf2 (i0 a) (i1 a)
g]
disjointRelations :: Data.Set.Set IntervalRelation
disjointRelations :: Set IntervalRelation
disjointRelations = [IntervalRelation] -> Set IntervalRelation
toSet [IntervalRelation
Before, IntervalRelation
After, IntervalRelation
Meets, IntervalRelation
MetBy]
withinRelations :: Data.Set.Set IntervalRelation
withinRelations :: Set IntervalRelation
withinRelations = [IntervalRelation] -> Set IntervalRelation
toSet [IntervalRelation
Starts, IntervalRelation
During, IntervalRelation
Finishes, IntervalRelation
Equals]
strictWithinRelations :: Data.Set.Set IntervalRelation
strictWithinRelations :: Set IntervalRelation
strictWithinRelations = forall a. Ord a => Set a -> Set a -> Set a
Data.Set.difference Set IntervalRelation
withinRelations ([IntervalRelation] -> Set IntervalRelation
toSet [IntervalRelation
Equals])
disjoint
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
disjoint :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
disjoint = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate Set IntervalRelation
disjointRelations
notDisjoint, concur
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
notDisjoint :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
notDisjoint = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate (Set IntervalRelation -> Set IntervalRelation
complement Set IntervalRelation
disjointRelations)
concur :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
concur = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
notDisjoint
within, enclosedBy
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
within :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
within = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate Set IntervalRelation
withinRelations
enclosedBy :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
enclosedBy = forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
within
encloses
:: (Ord a, Intervallic i0, Intervallic i1)
=> ComparativePredicateOf2 (i0 a) (i1 a)
encloses :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
encloses = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
enclosedBy
intervalRelations :: Data.Set.Set IntervalRelation
intervalRelations :: Set IntervalRelation
intervalRelations =
forall a. Ord a => [a] -> Set a
Data.Set.fromList (forall a b. (a -> b) -> [a] -> [b]
Prelude.map forall a. Enum a => Int -> a
toEnum [Int
0 .. Int
12] :: [IntervalRelation])
converseRelation :: IntervalRelation -> IntervalRelation
converseRelation :: IntervalRelation -> IntervalRelation
converseRelation IntervalRelation
x = forall a. Enum a => Int -> a
toEnum (Int
12 forall a. Num a => a -> a -> a
- forall a. Enum a => a -> Int
fromEnum IntervalRelation
x)
toSet :: [IntervalRelation] -> Data.Set.Set IntervalRelation
toSet :: [IntervalRelation] -> Set IntervalRelation
toSet = forall a. Ord a => [a] -> Set a
Data.Set.fromList
unionPredicates :: [ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates :: forall a b.
[ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates [ComparativePredicateOf2 a b]
fs a
x b
y = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\ComparativePredicateOf2 a b
f -> ComparativePredicateOf2 a b
f a
x b
y) [ComparativePredicateOf2 a b]
fs
toPredicate
:: (Ord a, Intervallic i0, Intervallic i1)
=> IntervalRelation
-> ComparativePredicateOf2 (i0 a) (i1 a)
toPredicate :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
toPredicate IntervalRelation
r = case IntervalRelation
r of
IntervalRelation
Before -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before
IntervalRelation
Meets -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
meets
IntervalRelation
Overlaps -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlaps
IntervalRelation
FinishedBy -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishedBy
IntervalRelation
Contains -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
contains
IntervalRelation
Starts -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
starts
IntervalRelation
Equals -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
equals
IntervalRelation
StartedBy -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
startedBy
IntervalRelation
During -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
during
IntervalRelation
Finishes -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishes
IntervalRelation
OverlappedBy -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlappedBy
IntervalRelation
MetBy -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
metBy
IntervalRelation
After -> forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
after
predicates
:: (Ord a, Intervallic i0, Intervallic i1)
=> Data.Set.Set IntervalRelation
-> [ComparativePredicateOf2 (i0 a) (i1 a)]
predicates :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> [ComparativePredicateOf2 (i0 a) (i1 a)]
predicates Set IntervalRelation
x = forall a b. (a -> b) -> [a] -> [b]
Prelude.map forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
toPredicate (forall a. Set a -> [a]
Data.Set.toList Set IntervalRelation
x)
predicate
:: (Ord a, Intervallic i0, Intervallic i1)
=> Data.Set.Set IntervalRelation
-> ComparativePredicateOf2 (i0 a) (i1 a)
predicate :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate = forall a b.
[ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> [ComparativePredicateOf2 (i0 a) (i1 a)]
predicates
composeRelationLookup :: [[[IntervalRelation]]]
composeRelationLookup :: [[[IntervalRelation]]]
composeRelationLookup =
[ [[IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
pmosd, [IntervalRelation]
pmosd, [IntervalRelation]
pmosd, [IntervalRelation]
pmosd, [IntervalRelation]
full]
, [[IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
m, [IntervalRelation]
m, [IntervalRelation]
m, [IntervalRelation]
osd, [IntervalRelation]
osd, [IntervalRelation]
osd, [IntervalRelation]
fef, [IntervalRelation]
dsomp]
, [[IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
pmo, [IntervalRelation]
pmo, [IntervalRelation]
pmofd, [IntervalRelation]
o, [IntervalRelation]
o, [IntervalRelation]
ofd, [IntervalRelation]
osd, [IntervalRelation]
osd, [IntervalRelation]
cncr, [IntervalRelation]
dso, [IntervalRelation]
dsomp]
, [[IntervalRelation]
p, [IntervalRelation]
m, [IntervalRelation]
o, [IntervalRelation]
f', [IntervalRelation]
d', [IntervalRelation]
o, [IntervalRelation]
f', [IntervalRelation]
d', [IntervalRelation]
osd, [IntervalRelation]
fef, [IntervalRelation]
dso, [IntervalRelation]
dso, [IntervalRelation]
dsomp]
, [[IntervalRelation]
pmofd, [IntervalRelation]
ofd, [IntervalRelation]
ofd, [IntervalRelation]
d', [IntervalRelation]
d', [IntervalRelation]
ofd, [IntervalRelation]
d', [IntervalRelation]
d', [IntervalRelation]
cncr, [IntervalRelation]
dso, [IntervalRelation]
dso, [IntervalRelation]
dso, [IntervalRelation]
dsomp]
, [[IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
pmo, [IntervalRelation]
pmo, [IntervalRelation]
pmofd, [IntervalRelation]
s, [IntervalRelation]
s, [IntervalRelation]
ses, [IntervalRelation]
d, [IntervalRelation]
d, [IntervalRelation]
dfo, [IntervalRelation]
m', [IntervalRelation]
p']
, [[IntervalRelation]
p, [IntervalRelation]
m, [IntervalRelation]
o, [IntervalRelation]
f', [IntervalRelation]
d', [IntervalRelation]
s, [IntervalRelation]
e, [IntervalRelation]
s', [IntervalRelation]
d, [IntervalRelation]
f, [IntervalRelation]
o', [IntervalRelation]
m', [IntervalRelation]
p']
, [[IntervalRelation]
pmofd, [IntervalRelation]
ofd, [IntervalRelation]
ofd, [IntervalRelation]
d', [IntervalRelation]
d', [IntervalRelation]
ses, [IntervalRelation]
s', [IntervalRelation]
s', [IntervalRelation]
dfo, [IntervalRelation]
o', [IntervalRelation]
o', [IntervalRelation]
m', [IntervalRelation]
p']
, [[IntervalRelation]
p, [IntervalRelation]
p, [IntervalRelation]
pmosd, [IntervalRelation]
pmosd, [IntervalRelation]
full, [IntervalRelation]
d, [IntervalRelation]
d, [IntervalRelation]
dfomp, [IntervalRelation]
d, [IntervalRelation]
d, [IntervalRelation]
dfomp, [IntervalRelation]
p', [IntervalRelation]
p']
, [[IntervalRelation]
p, [IntervalRelation]
m, [IntervalRelation]
osd, [IntervalRelation]
fef, [IntervalRelation]
dsomp, [IntervalRelation]
d, [IntervalRelation]
f, [IntervalRelation]
omp, [IntervalRelation]
d, [IntervalRelation]
f, [IntervalRelation]
omp, [IntervalRelation]
p', [IntervalRelation]
p']
, [[IntervalRelation]
pmofd, [IntervalRelation]
ofd, [IntervalRelation]
cncr, [IntervalRelation]
dso, [IntervalRelation]
dsomp, [IntervalRelation]
dfo, [IntervalRelation]
o', [IntervalRelation]
omp, [IntervalRelation]
dfo, [IntervalRelation]
o', [IntervalRelation]
omp, [IntervalRelation]
p', [IntervalRelation]
p']
, [[IntervalRelation]
pmofd, [IntervalRelation]
ses, [IntervalRelation]
dfo, [IntervalRelation]
m', [IntervalRelation]
p', [IntervalRelation]
dfo, [IntervalRelation]
m', [IntervalRelation]
p', [IntervalRelation]
dfo, [IntervalRelation]
m', [IntervalRelation]
p', [IntervalRelation]
p', [IntervalRelation]
p']
, [[IntervalRelation]
full, [IntervalRelation]
dfomp, [IntervalRelation]
dfomp, [IntervalRelation]
p', [IntervalRelation]
p', [IntervalRelation]
dfomp, [IntervalRelation]
p', [IntervalRelation]
p', [IntervalRelation]
dfomp, [IntervalRelation]
p', [IntervalRelation]
p', [IntervalRelation]
p', [IntervalRelation]
p']
]
where
p :: [IntervalRelation]
p = [IntervalRelation
Before]
m :: [IntervalRelation]
m = [IntervalRelation
Meets]
o :: [IntervalRelation]
o = [IntervalRelation
Overlaps]
f' :: [IntervalRelation]
f' = [IntervalRelation
FinishedBy]
d' :: [IntervalRelation]
d' = [IntervalRelation
Contains]
s :: [IntervalRelation]
s = [IntervalRelation
Starts]
e :: [IntervalRelation]
e = [IntervalRelation
Equals]
s' :: [IntervalRelation]
s' = [IntervalRelation
StartedBy]
d :: [IntervalRelation]
d = [IntervalRelation
During]
f :: [IntervalRelation]
f = [IntervalRelation
Finishes]
o' :: [IntervalRelation]
o' = [IntervalRelation
OverlappedBy]
m' :: [IntervalRelation]
m' = [IntervalRelation
MetBy]
p' :: [IntervalRelation]
p' = [IntervalRelation
After]
ses :: [IntervalRelation]
ses = [IntervalRelation]
s forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
e forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s'
fef :: [IntervalRelation]
fef = [IntervalRelation]
f' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
e forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f
pmo :: [IntervalRelation]
pmo = [IntervalRelation]
p forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o
pmofd :: [IntervalRelation]
pmofd = [IntervalRelation]
pmo forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d'
osd :: [IntervalRelation]
osd = [IntervalRelation]
o forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d
ofd :: [IntervalRelation]
ofd = [IntervalRelation]
o forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d'
omp :: [IntervalRelation]
omp = [IntervalRelation]
o' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
dfo :: [IntervalRelation]
dfo = [IntervalRelation]
d forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o'
dfomp :: [IntervalRelation]
dfomp = [IntervalRelation]
dfo forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
dso :: [IntervalRelation]
dso = [IntervalRelation]
d' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o'
dsomp :: [IntervalRelation]
dsomp = [IntervalRelation]
dso forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
pmosd :: [IntervalRelation]
pmosd = [IntervalRelation]
p forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
osd
cncr :: [IntervalRelation]
cncr = [IntervalRelation]
o forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
e forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o'
full :: [IntervalRelation]
full = [IntervalRelation]
p forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
cncr forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
relate
:: (Ord a, Intervallic i0, Intervallic i1) => i0 a -> i1 a -> IntervalRelation
relate :: forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
i0 a -> i1 a -> IntervalRelation
relate i0 a
x i1 a
y | i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`before` i1 a
y = IntervalRelation
Before
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`after` i1 a
y = IntervalRelation
After
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`meets` i1 a
y = IntervalRelation
Meets
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`metBy` i1 a
y = IntervalRelation
MetBy
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`overlaps` i1 a
y = IntervalRelation
Overlaps
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`overlappedBy` i1 a
y = IntervalRelation
OverlappedBy
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`starts` i1 a
y = IntervalRelation
Starts
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`startedBy` i1 a
y = IntervalRelation
StartedBy
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`finishes` i1 a
y = IntervalRelation
Finishes
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`finishedBy` i1 a
y = IntervalRelation
FinishedBy
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`during` i1 a
y = IntervalRelation
During
| i0 a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`contains` i1 a
y = IntervalRelation
Contains
| Bool
otherwise = IntervalRelation
Equals
compose
:: IntervalRelation -> IntervalRelation -> Data.Set.Set IntervalRelation
compose :: IntervalRelation -> IntervalRelation -> Set IntervalRelation
compose IntervalRelation
x IntervalRelation
y = [IntervalRelation] -> Set IntervalRelation
toSet ([[[IntervalRelation]]]
composeRelationLookup forall a. [a] -> Int -> a
!! forall a. Enum a => a -> Int
fromEnum IntervalRelation
x forall a. [a] -> Int -> a
!! forall a. Enum a => a -> Int
fromEnum IntervalRelation
y)
complement :: Data.Set.Set IntervalRelation -> Data.Set.Set IntervalRelation
complement :: Set IntervalRelation -> Set IntervalRelation
complement = forall a. Ord a => Set a -> Set a -> Set a
Data.Set.difference Set IntervalRelation
intervalRelations
intersection
:: Data.Set.Set IntervalRelation
-> Data.Set.Set IntervalRelation
-> Data.Set.Set IntervalRelation
intersection :: Set IntervalRelation
-> Set IntervalRelation -> Set IntervalRelation
intersection = forall a. Ord a => Set a -> Set a -> Set a
Data.Set.intersection
union
:: Data.Set.Set IntervalRelation
-> Data.Set.Set IntervalRelation
-> Data.Set.Set IntervalRelation
union :: Set IntervalRelation
-> Set IntervalRelation -> Set IntervalRelation
union = forall a. Ord a => Set a -> Set a -> Set a
Data.Set.union
converse :: Data.Set.Set IntervalRelation -> Data.Set.Set IntervalRelation
converse :: Set IntervalRelation -> Set IntervalRelation
converse = forall b a. Ord b => (a -> b) -> Set a -> Set b
Data.Set.map IntervalRelation -> IntervalRelation
converseRelation
class (Ord a, Num b, Ord b) => IntervalSizeable a b | a -> b where
moment :: forall a . b
moment = b
1
duration :: (Intervallic i) => i a -> b
duration i a
x = forall a b. IntervalSizeable a b => a -> a -> b
diff (forall (i :: * -> *) a. Intervallic i => i a -> a
end i a
x) (forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
x)
add :: b -> a -> a
diff :: a -> a -> b
expand
:: forall i a b
. (IntervalSizeable a b, Intervallic i)
=> b
-> b
-> i a
-> i a
expand :: forall (i :: * -> *) a b.
(IntervalSizeable a b, Intervallic i) =>
b -> b -> i a -> i a
expand b
l b
r i a
p = forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
p Interval a
i
where
s :: b
s = if b
l forall a. Ord a => a -> a -> Bool
< forall a b a. IntervalSizeable a b => b
moment @a then b
0 else forall a. Num a => a -> a
negate b
l
e :: b
e = if b
r forall a. Ord a => a -> a -> Bool
< forall a b a. IntervalSizeable a b => b
moment @a then b
0 else b
r
i :: Interval a
i = forall a. (a, a) -> Interval a
Interval (forall a b. IntervalSizeable a b => b -> a -> a
add b
s forall a b. (a -> b) -> a -> b
$ forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
p, forall a b. IntervalSizeable a b => b -> a -> a
add b
e forall a b. (a -> b) -> a -> b
$ forall (i :: * -> *) a. Intervallic i => i a -> a
end i a
p)
expandl :: (IntervalSizeable a b, Intervallic i) => b -> i a -> i a
expandl :: forall a b (i :: * -> *).
(IntervalSizeable a b, Intervallic i) =>
b -> i a -> i a
expandl b
i = forall (i :: * -> *) a b.
(IntervalSizeable a b, Intervallic i) =>
b -> b -> i a -> i a
expand b
i b
0
expandr :: (IntervalSizeable a b, Intervallic i) => b -> i a -> i a
expandr :: forall a b (i :: * -> *).
(IntervalSizeable a b, Intervallic i) =>
b -> i a -> i a
expandr = forall (i :: * -> *) a b.
(IntervalSizeable a b, Intervallic i) =>
b -> b -> i a -> i a
expand b
0
beginerval
:: forall a b
. (IntervalSizeable a b)
=> b
-> a
-> Interval a
beginerval :: forall a b. IntervalSizeable a b => b -> a -> Interval a
beginerval b
dur a
x = forall a. (a, a) -> Interval a
Interval (a
x, a
y)
where
i :: Interval a
i = forall a. (a, a) -> Interval a
Interval (a
x, a
x)
d :: b
d = forall a. Ord a => a -> a -> a
max (forall a b a. IntervalSizeable a b => b
moment @a) b
dur
y :: a
y = forall a b. IntervalSizeable a b => b -> a -> a
add b
d a
x
{-# INLINABLE beginerval #-}
bi
:: (IntervalSizeable a b)
=> b
-> a
-> Interval a
bi :: forall a b. IntervalSizeable a b => b -> a -> Interval a
bi = forall a b. IntervalSizeable a b => b -> a -> Interval a
beginerval
enderval
:: forall a b
. (IntervalSizeable a b)
=> b
-> a
-> Interval a
enderval :: forall a b. IntervalSizeable a b => b -> a -> Interval a
enderval b
dur a
x = forall a. (a, a) -> Interval a
Interval (forall a b. IntervalSizeable a b => b -> a -> a
add (forall a. Num a => a -> a
negate forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> a -> a
max (forall a b a. IntervalSizeable a b => b
moment @a) b
dur) a
x, a
x)
where i :: Interval a
i = forall a. (a, a) -> Interval a
Interval (a
x, a
x)
{-# INLINABLE enderval #-}
ei
:: (IntervalSizeable a b)
=> b
-> a
-> Interval a
ei :: forall a b. IntervalSizeable a b => b -> a -> Interval a
ei = forall a b. IntervalSizeable a b => b -> a -> Interval a
enderval
safeInterval :: IntervalSizeable a b => (a, a) -> Interval a
safeInterval :: forall a b. IntervalSizeable a b => (a, a) -> Interval a
safeInterval (a
b, a
e) = forall a b. IntervalSizeable a b => b -> a -> Interval a
beginerval (forall a b. IntervalSizeable a b => a -> a -> b
diff a
e a
b) a
b
si :: IntervalSizeable a b => (a, a) -> Interval a
si :: forall a b. IntervalSizeable a b => (a, a) -> Interval a
si = forall a b. IntervalSizeable a b => (a, a) -> Interval a
safeInterval
beginervalFromEnd
:: (IntervalSizeable a b, Intervallic i)
=> b
-> i a
-> Interval a
beginervalFromEnd :: forall a b (i :: * -> *).
(IntervalSizeable a b, Intervallic i) =>
b -> i a -> Interval a
beginervalFromEnd b
d i a
i = forall a b. IntervalSizeable a b => b -> a -> Interval a
beginerval b
d (forall (i :: * -> *) a. Intervallic i => i a -> a
end i a
i)
endervalFromBegin
:: (IntervalSizeable a b, Intervallic i)
=> b
-> i a
-> Interval a
endervalFromBegin :: forall a b (i :: * -> *).
(IntervalSizeable a b, Intervallic i) =>
b -> i a -> Interval a
endervalFromBegin b
d i a
i = forall a b. IntervalSizeable a b => b -> a -> Interval a
enderval b
d (forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
i)
beginervalMoment :: forall a b . (IntervalSizeable a b) => a -> Interval a
beginervalMoment :: forall a b. IntervalSizeable a b => a -> Interval a
beginervalMoment a
x = forall a b. IntervalSizeable a b => b -> a -> Interval a
beginerval (forall a b a. IntervalSizeable a b => b
moment @a) a
x where i :: Interval a
i = forall a. (a, a) -> Interval a
Interval (a
x, a
x)
endervalMoment :: forall a b . (IntervalSizeable a b) => a -> Interval a
endervalMoment :: forall a b. IntervalSizeable a b => a -> Interval a
endervalMoment a
x = forall a b. IntervalSizeable a b => b -> a -> Interval a
enderval (forall a b a. IntervalSizeable a b => b
moment @a) a
x where i :: Interval a
i = forall a. (a, a) -> Interval a
Interval (a
x, a
x)
extenterval :: (Ord a, Intervallic i) => i a -> i a -> Interval a
extenterval :: forall a (i :: * -> *).
(Ord a, Intervallic i) =>
i a -> i a -> Interval a
extenterval i a
x i a
y = forall a. (a, a) -> Interval a
Interval (a
s, a
e)
where
s :: a
s = forall a. Ord a => a -> a -> a
min (forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
x) (forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
y)
e :: a
e = forall a. Ord a => a -> a -> a
max (forall (i :: * -> *) a. Intervallic i => i a -> a
end i a
x) (forall (i :: * -> *) a. Intervallic i => i a -> a
end i a
y)
shiftFromBegin
:: (IntervalSizeable a b, Intervallic i1, Intervallic i0)
=> i0 a
-> i1 a
-> i1 b
shiftFromBegin :: forall a b (i1 :: * -> *) (i0 :: * -> *).
(IntervalSizeable a b, Intervallic i1, Intervallic i0) =>
i0 a -> i1 a -> i1 b
shiftFromBegin i0 a
i = forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone (forall a b. IntervalSizeable a b => a -> a -> b
`diff` forall (i :: * -> *) a. Intervallic i => i a -> a
begin i0 a
i)
shiftFromEnd
:: (IntervalSizeable a b, Intervallic i1, Intervallic i0)
=> i0 a
-> i1 a
-> i1 b
shiftFromEnd :: forall a b (i1 :: * -> *) (i0 :: * -> *).
(IntervalSizeable a b, Intervallic i1, Intervallic i0) =>
i0 a -> i1 a -> i1 b
shiftFromEnd i0 a
i = forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone (forall a b. IntervalSizeable a b => a -> a -> b
`diff` forall (i :: * -> *) a. Intervallic i => i a -> a
end i0 a
i)
fromEnumInterval :: (Enum a, Intervallic i) => i a -> i Int
= forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone forall a. Enum a => a -> Int
fromEnum
toEnumInterval :: (Enum a, Intervallic i) => i Int -> i a
toEnumInterval :: forall a (i :: * -> *). (Enum a, Intervallic i) => i Int -> i a
toEnumInterval = forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone forall a. Enum a => Int -> a
toEnum
momentize
:: forall i a b . (IntervalSizeable a b, Intervallic i) => i a -> i a
momentize :: forall (i :: * -> *) a b.
(IntervalSizeable a b, Intervallic i) =>
i a -> i a
momentize i a
i = forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
i (forall a b. IntervalSizeable a b => b -> a -> Interval a
beginerval (forall a b a. IntervalSizeable a b => b
moment @a) (forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
i))
class (Ord a, Intervallic i) => IntervalCombinable i a where
(.+.) :: i a -> i a -> Maybe (i a)
(.+.) i a
x i a
y
| i a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Eq a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`meets` i a
y = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
y forall a b. (a -> b) -> a -> b
$ forall a. (a, a) -> Interval a
Interval (a
b, a
e)
| Bool
otherwise = forall a. Maybe a
Nothing
where b :: a
b = forall (i :: * -> *) a. Intervallic i => i a -> a
begin i a
x
e :: a
e = forall (i :: * -> *) a. Intervallic i => i a -> a
end i a
y
{-# INLINABLE (.+.) #-}
(><) :: i a -> i a -> Maybe (i a)
(<+>):: ( Semigroup (f (i a)), Applicative f) =>
i a
-> i a
-> f (i a)
{-# DEPRECATED (<+>) "A specialized function without clear use-cases." #-}
type ComparativePredicateOf1 a = (a -> a -> Bool)
type ComparativePredicateOf2 a b = (a -> b -> Bool)
instance (Ord a) => Ord (Interval a) where
<= :: Interval a -> Interval a -> Bool
(<=) Interval a
x Interval a
y | forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
y = Bool
True
| forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
end Interval a
x forall a. Ord a => a -> a -> Bool
<= forall (i :: * -> *) a. Intervallic i => i a -> a
end Interval a
y
| Bool
otherwise = Bool
False
< :: Interval a -> Interval a -> Bool
(<) Interval a
x Interval a
y | forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
y = Bool
True
| forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
x forall a. Eq a => a -> a -> Bool
== forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
y = forall (i :: * -> *) a. Intervallic i => i a -> a
end Interval a
x forall a. Ord a => a -> a -> Bool
< forall (i :: * -> *) a. Intervallic i => i a -> a
end Interval a
y
| Bool
otherwise = Bool
False
instance Intervallic Interval where
getInterval :: forall a. Interval a -> Interval a
getInterval = forall a. a -> a
id
setInterval :: forall a b. Interval a -> Interval b -> Interval b
setInterval Interval a
_ Interval b
x = Interval b
x
instance (Ord a) => IntervalCombinable Interval a where
>< :: Interval a -> Interval a -> Maybe (Interval a)
(><) Interval a
x Interval a
y | Interval a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`before` Interval a
y = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. (a, a) -> Interval a
Interval (forall (i :: * -> *) a. Intervallic i => i a -> a
end Interval a
x, forall (i :: * -> *) a. Intervallic i => i a -> a
begin Interval a
y)
| Bool
otherwise = forall a. Maybe a
Nothing
{-# INLINABLE (><) #-}
<+> :: forall (f :: * -> *).
(Semigroup (f (Interval a)), Applicative f) =>
Interval a -> Interval a -> f (Interval a)
(<+>) Interval a
x Interval a
y | Interval a
x forall a (i0 :: * -> *) (i1 :: * -> *).
(Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
`before` Interval a
y = forall (f :: * -> *) a. Applicative f => a -> f a
pure Interval a
x forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Applicative f => a -> f a
pure Interval a
y
| Bool
otherwise = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a (i :: * -> *).
(Ord a, Intervallic i) =>
i a -> i a -> Interval a
extenterval Interval a
x Interval a
y)
{-# INLINABLE (<+>) #-}
instance IntervalSizeable Int Int where
moment :: forall a. Int
moment = Int
1
add :: Int -> Int -> Int
add = forall a. Num a => a -> a -> a
(+)
diff :: Int -> Int -> Int
diff = (-)
instance IntervalSizeable Integer Integer where
moment :: forall a. Integer
moment = Integer
1
add :: Integer -> Integer -> Integer
add = forall a. Num a => a -> a -> a
(+)
diff :: Integer -> Integer -> Integer
diff = (-)
instance IntervalSizeable DT.Day Integer where
moment :: forall a. Integer
moment = Integer
1
add :: Integer -> Day -> Day
add = Integer -> Day -> Day
addDays
diff :: Day -> Day -> Integer
diff = Day -> Day -> Integer
diffDays
instance IntervalSizeable DT.UTCTime NominalDiffTime where
moment :: forall a. NominalDiffTime
moment = forall a. Enum a => Int -> a
toEnum Int
1 :: NominalDiffTime
add :: NominalDiffTime -> UTCTime -> UTCTime
add = NominalDiffTime -> UTCTime -> UTCTime
addUTCTime
diff :: UTCTime -> UTCTime -> NominalDiffTime
diff = UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime
instance (Ord a, Arbitrary a) => Arbitrary (Interval a) where
arbitrary :: Gen (Interval a)
arbitrary =
forall a. (Int -> Gen a) -> Gen a
sized
(\Int
s -> forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (forall a b c. ((a, b) -> c) -> a -> b -> c
curry forall a. (a, a) -> Interval a
Interval)
(Int
s forall a. Int -> Gen a -> Gen a
`resize` forall a. Arbitrary a => Gen a
arbitrary)
(Int
s forall a. Int -> Gen a -> Gen a
`resize` forall a. Arbitrary a => Gen a
arbitrary)
)
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` (\Interval a
i -> forall a. Ord a => a -> a -> Bool
isValidBeginEnd (forall a. Interval a -> a
intervalBegin Interval a
i) (forall a. Interval a -> a
intervalEnd Interval a
i))