{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module IntervalAlgebra.Core
(
Interval,
PointedIv (..),
SizedIv (..),
Intervallic (..),
begin,
end,
ParseErrorInterval (..),
parseInterval,
prsi,
beginerval,
bi,
enderval,
ei,
safeInterval,
si,
expand,
expandl,
expandr,
extenterval,
Iv (..),
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,
converseRelation,
)
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.Kind (Type)
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 GHC.IO.Handle (NewlineMode (inputNL))
import Test.QuickCheck (Arbitrary (..), resize, sized, suchThat)
newtype Interval a
= Interval (a, a)
deriving (Interval a -> Interval a -> Bool
(Interval a -> Interval a -> Bool)
-> (Interval a -> Interval a -> Bool) -> Eq (Interval a)
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 x. Interval a -> Rep (Interval a) x)
-> (forall x. Rep (Interval a) x -> Interval a)
-> Generic (Interval a)
forall x. Rep (Interval a) x -> Interval a
forall x. Interval a -> Rep (Interval a) x
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
(ParseErrorInterval -> ParseErrorInterval -> Bool)
-> (ParseErrorInterval -> ParseErrorInterval -> Bool)
-> Eq ParseErrorInterval
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
(Int -> ParseErrorInterval -> ShowS)
-> (ParseErrorInterval -> String)
-> ([ParseErrorInterval] -> ShowS)
-> Show ParseErrorInterval
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 :: a -> a -> Bool
isValidBeginEnd a
b a
e = a
b a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
e
parseInterval ::
(Show a, Ord a) => a -> a -> Either ParseErrorInterval (Interval a)
parseInterval :: a -> a -> Either ParseErrorInterval (Interval a)
parseInterval a
x a
y
| a -> a -> Bool
forall a. Ord a => a -> a -> Bool
isValidBeginEnd a
x a
y = Interval a -> Either ParseErrorInterval (Interval a)
forall a b. b -> Either a b
Right (Interval a -> Either ParseErrorInterval (Interval a))
-> Interval a -> Either ParseErrorInterval (Interval a)
forall a b. (a -> b) -> a -> b
$ (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
x, a
y)
| Bool
otherwise = ParseErrorInterval -> Either ParseErrorInterval (Interval a)
forall a b. a -> Either a b
Left (ParseErrorInterval -> Either ParseErrorInterval (Interval a))
-> ParseErrorInterval -> Either ParseErrorInterval (Interval a)
forall a b. (a -> b) -> a -> b
$ String -> ParseErrorInterval
ParseErrorInterval (String -> ParseErrorInterval) -> String -> ParseErrorInterval
forall a b. (a -> b) -> a -> b
$ a -> String
forall a. Show a => a -> String
show a
y String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"<=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
x
prsi :: (Show a, Ord a) => a -> a -> Either ParseErrorInterval (Interval a)
prsi :: a -> a -> Either ParseErrorInterval (Interval a)
prsi = a -> a -> Either ParseErrorInterval (Interval a)
forall a.
(Show a, Ord a) =>
a -> a -> Either ParseErrorInterval (Interval a)
parseInterval
instance (Show a, Ord a) => Show (Interval a) where
show :: Interval a -> String
show (Interval (a, a)
x) = String
"(" String -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show ((a, a) -> a
forall a b. (a, b) -> a
fst (a, a)
x) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", " String -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show ((a, a) -> a
forall a b. (a, b) -> b
snd (a, a)
x) String -> ShowS
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 :: forall i a. (SizedIv (Interval a), Intervallic i) => i a -> a
begin :: i a -> a
begin = Interval a -> a
forall iv. PointedIv iv => iv -> Point iv
ivBegin (Interval a -> a) -> (i a -> Interval a) -> i a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval
end :: i a -> a
end = Interval a -> a
forall iv. PointedIv iv => iv -> Point iv
ivEnd (Interval a -> a) -> (i a -> Interval a) -> i a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval
imapStrictMonotone :: (Intervallic i) => (a -> b) -> i a -> i b
imapStrictMonotone :: (a -> b) -> i a -> i b
imapStrictMonotone a -> b
f i a
i = i a -> Interval b -> i b
forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
i ((a -> b) -> Interval a -> Interval b
forall t a. (t -> a) -> Interval t -> Interval a
op a -> b
f (i a -> Interval a
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)) = (a, a) -> Interval a
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 (Int -> IntervalRelation
IntervalRelation -> Int
IntervalRelation -> [IntervalRelation]
IntervalRelation -> IntervalRelation
IntervalRelation -> IntervalRelation -> [IntervalRelation]
IntervalRelation
-> IntervalRelation -> IntervalRelation -> [IntervalRelation]
(IntervalRelation -> IntervalRelation)
-> (IntervalRelation -> IntervalRelation)
-> (Int -> IntervalRelation)
-> (IntervalRelation -> Int)
-> (IntervalRelation -> [IntervalRelation])
-> (IntervalRelation -> IntervalRelation -> [IntervalRelation])
-> (IntervalRelation -> IntervalRelation -> [IntervalRelation])
-> (IntervalRelation
-> IntervalRelation -> IntervalRelation -> [IntervalRelation])
-> Enum 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, IntervalRelation -> IntervalRelation -> Bool
(IntervalRelation -> IntervalRelation -> Bool)
-> (IntervalRelation -> IntervalRelation -> Bool)
-> Eq IntervalRelation
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
(Int -> IntervalRelation -> ShowS)
-> (IntervalRelation -> String)
-> ([IntervalRelation] -> ShowS)
-> Show IntervalRelation
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)
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 = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (IntervalRelation -> Int
forall a. Enum a => a -> Int
fromEnum IntervalRelation
x) (IntervalRelation -> Int
forall a. Enum a => a -> Int
fromEnum IntervalRelation
y)
meets,
metBy ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
meets :: ComparativePredicateOf2 (i0 a) (i1 a)
meets i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivMeets (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
metBy :: ComparativePredicateOf2 (i0 a) (i1 a)
metBy = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
meets
before,
after,
precedes,
precededBy ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before :: ComparativePredicateOf2 (i0 a) (i1 a)
before i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivBefore (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
after :: ComparativePredicateOf2 (i0 a) (i1 a)
after = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before
precedes :: ComparativePredicateOf2 (i0 a) (i1 a)
precedes = ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before
precededBy :: ComparativePredicateOf2 (i0 a) (i1 a)
precededBy = ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
after
ivPrecedes, ivPrecededBy :: (Iv iv) => iv -> iv -> Bool
ivPrecedes :: iv -> iv -> Bool
ivPrecedes = iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivBefore
ivPrecededBy :: iv -> iv -> Bool
ivPrecededBy = iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivAfter
overlaps,
overlappedBy ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlaps :: ComparativePredicateOf2 (i0 a) (i1 a)
overlaps i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivOverlaps (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
overlappedBy :: ComparativePredicateOf2 (i0 a) (i1 a)
overlappedBy = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlaps
starts,
startedBy ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
starts :: ComparativePredicateOf2 (i0 a) (i1 a)
starts i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivStarts (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
startedBy :: ComparativePredicateOf2 (i0 a) (i1 a)
startedBy = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
starts
finishes,
finishedBy ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishes :: ComparativePredicateOf2 (i0 a) (i1 a)
finishes i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivFinishes (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
finishedBy :: ComparativePredicateOf2 (i0 a) (i1 a)
finishedBy = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishes
during,
contains ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
during :: ComparativePredicateOf2 (i0 a) (i1 a)
during i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivDuring (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
contains :: ComparativePredicateOf2 (i0 a) (i1 a)
contains = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
during
equals ::
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
equals :: ComparativePredicateOf2 (i0 a) (i1 a)
equals i0 a
x i1 a
y = Interval a -> Interval a -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivEquals (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
(<|>) ::
(Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a) ->
ComparativePredicateOf2 (i0 a) (i1 a) ->
ComparativePredicateOf2 (i0 a) (i1 a)
<|> :: 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 = [ComparativePredicateOf2 (i0 a) (i1 a)]
-> ComparativePredicateOf2 (i0 a) (i1 a)
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 = Set IntervalRelation
-> Set IntervalRelation -> Set IntervalRelation
forall a. Ord a => Set a -> Set a -> Set a
Data.Set.difference Set IntervalRelation
withinRelations ([IntervalRelation] -> Set IntervalRelation
toSet [IntervalRelation
Equals])
disjoint ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
disjoint :: ComparativePredicateOf2 (i0 a) (i1 a)
disjoint = Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate Set IntervalRelation
disjointRelations
notDisjoint,
concur ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
notDisjoint :: ComparativePredicateOf2 (i0 a) (i1 a)
notDisjoint = Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate (Set IntervalRelation -> Set IntervalRelation
complement Set IntervalRelation
disjointRelations)
concur :: ComparativePredicateOf2 (i0 a) (i1 a)
concur = ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
notDisjoint
within,
enclosedBy ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
within :: ComparativePredicateOf2 (i0 a) (i1 a)
within = Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate Set IntervalRelation
withinRelations
enclosedBy :: ComparativePredicateOf2 (i0 a) (i1 a)
enclosedBy = ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
within
encloses ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
encloses :: ComparativePredicateOf2 (i0 a) (i1 a)
encloses = (i1 a -> i0 a -> Bool) -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip i1 a -> i0 a -> Bool
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
enclosedBy
intervalRelations :: Data.Set.Set IntervalRelation
intervalRelations :: Set IntervalRelation
intervalRelations =
[IntervalRelation] -> Set IntervalRelation
forall a. Ord a => [a] -> Set a
Data.Set.fromList ((Int -> IntervalRelation) -> [Int] -> [IntervalRelation]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Int -> IntervalRelation
forall a. Enum a => Int -> a
toEnum [Int
0 .. Int
12] :: [IntervalRelation])
converseRelation :: IntervalRelation -> IntervalRelation
converseRelation :: IntervalRelation -> IntervalRelation
converseRelation IntervalRelation
x = Int -> IntervalRelation
forall a. Enum a => Int -> a
toEnum (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
- IntervalRelation -> Int
forall a. Enum a => a -> Int
fromEnum IntervalRelation
x)
toSet :: [IntervalRelation] -> Data.Set.Set IntervalRelation
toSet :: [IntervalRelation] -> Set IntervalRelation
toSet = [IntervalRelation] -> Set IntervalRelation
forall a. Ord a => [a] -> Set a
Data.Set.fromList
unionPredicates :: [ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates :: [ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates [ComparativePredicateOf2 a b]
fs a
x b
y = (ComparativePredicateOf2 a b -> Bool)
-> [ComparativePredicateOf2 a b] -> Bool
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 ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
IntervalRelation ->
ComparativePredicateOf2 (i0 a) (i1 a)
toPredicate :: IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
toPredicate IntervalRelation
r = case IntervalRelation
r of
IntervalRelation
Before -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
before
IntervalRelation
Meets -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
meets
IntervalRelation
Overlaps -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlaps
IntervalRelation
FinishedBy -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishedBy
IntervalRelation
Contains -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
contains
IntervalRelation
Starts -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
starts
IntervalRelation
Equals -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
equals
IntervalRelation
StartedBy -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
startedBy
IntervalRelation
During -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
during
IntervalRelation
Finishes -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
finishes
IntervalRelation
OverlappedBy -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
overlappedBy
IntervalRelation
MetBy -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
metBy
IntervalRelation
After -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(Iv (Interval a), Intervallic i0, Intervallic i1) =>
ComparativePredicateOf2 (i0 a) (i1 a)
after
predicates ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
Data.Set.Set IntervalRelation ->
[ComparativePredicateOf2 (i0 a) (i1 a)]
predicates :: Set IntervalRelation -> [ComparativePredicateOf2 (i0 a) (i1 a)]
predicates Set IntervalRelation
x = (IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a))
-> [IntervalRelation] -> [ComparativePredicateOf2 (i0 a) (i1 a)]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
toPredicate (Set IntervalRelation -> [IntervalRelation]
forall a. Set a -> [a]
Data.Set.toList Set IntervalRelation
x)
predicate ::
(SizedIv (Interval a), Ord a, Intervallic i0, Intervallic i1) =>
Data.Set.Set IntervalRelation ->
ComparativePredicateOf2 (i0 a) (i1 a)
predicate :: Set IntervalRelation -> ComparativePredicateOf2 (i0 a) (i1 a)
predicate = [ComparativePredicateOf2 (i0 a) (i1 a)]
-> ComparativePredicateOf2 (i0 a) (i1 a)
forall a b.
[ComparativePredicateOf2 a b] -> ComparativePredicateOf2 a b
unionPredicates ([ComparativePredicateOf2 (i0 a) (i1 a)]
-> ComparativePredicateOf2 (i0 a) (i1 a))
-> (Set IntervalRelation
-> [ComparativePredicateOf2 (i0 a) (i1 a)])
-> Set IntervalRelation
-> ComparativePredicateOf2 (i0 a) (i1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set IntervalRelation -> [ComparativePredicateOf2 (i0 a) (i1 a)]
forall a (i0 :: * -> *) (i1 :: * -> *).
(SizedIv (Interval a), 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 [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
e [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s'
fef :: [IntervalRelation]
fef = [IntervalRelation]
f' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
e [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f
pmo :: [IntervalRelation]
pmo = [IntervalRelation]
p [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o
pmofd :: [IntervalRelation]
pmofd = [IntervalRelation]
pmo [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d'
osd :: [IntervalRelation]
osd = [IntervalRelation]
o [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d
ofd :: [IntervalRelation]
ofd = [IntervalRelation]
o [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d'
omp :: [IntervalRelation]
omp = [IntervalRelation]
o' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
dfo :: [IntervalRelation]
dfo = [IntervalRelation]
d [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o'
dfomp :: [IntervalRelation]
dfomp = [IntervalRelation]
dfo [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
dso :: [IntervalRelation]
dso = [IntervalRelation]
d' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o'
dsomp :: [IntervalRelation]
dsomp = [IntervalRelation]
dso [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
pmosd :: [IntervalRelation]
pmosd = [IntervalRelation]
p [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
osd
cncr :: [IntervalRelation]
cncr = [IntervalRelation]
o [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
e [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
s' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
d [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
f [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
o'
full :: [IntervalRelation]
full = [IntervalRelation]
p [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
cncr [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
m' [IntervalRelation] -> [IntervalRelation] -> [IntervalRelation]
forall a. [a] -> [a] -> [a]
++ [IntervalRelation]
p'
relate ::
(Iv (Interval a), Intervallic i0, Intervallic i1) => i0 a -> i1 a -> IntervalRelation
relate :: i0 a -> i1 a -> IntervalRelation
relate i0 a
x i1 a
y = Interval a -> Interval a -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate (i0 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i0 a
x) (i1 a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i1 a
y)
compose ::
IntervalRelation -> IntervalRelation -> Data.Set.Set IntervalRelation
compose :: IntervalRelation -> IntervalRelation -> Set IntervalRelation
compose IntervalRelation
x IntervalRelation
y = [IntervalRelation] -> Set IntervalRelation
toSet ([[[IntervalRelation]]]
composeRelationLookup [[[IntervalRelation]]] -> Int -> [[IntervalRelation]]
forall a. [a] -> Int -> a
!! IntervalRelation -> Int
forall a. Enum a => a -> Int
fromEnum IntervalRelation
x [[IntervalRelation]] -> Int -> [IntervalRelation]
forall a. [a] -> Int -> a
!! IntervalRelation -> Int
forall a. Enum a => a -> Int
fromEnum IntervalRelation
y)
complement :: Data.Set.Set IntervalRelation -> Data.Set.Set IntervalRelation
complement :: Set IntervalRelation -> Set IntervalRelation
complement = Set IntervalRelation
-> Set IntervalRelation -> Set IntervalRelation
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 = Set IntervalRelation
-> Set IntervalRelation -> Set IntervalRelation
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 = Set IntervalRelation
-> Set IntervalRelation -> Set IntervalRelation
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 = (IntervalRelation -> IntervalRelation)
-> Set IntervalRelation -> Set IntervalRelation
forall b a. Ord b => (a -> b) -> Set a -> Set b
Data.Set.map IntervalRelation -> IntervalRelation
converseRelation
class Iv iv where
{-# MINIMAL ivRelate | ivBefore, ivMeets, ivOverlaps, ivStarts, ivFinishes, ivDuring, ivEquals #-}
ivRelate :: iv -> iv -> IntervalRelation
ivRelate iv
x iv
y
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivBefore` iv
y = IntervalRelation
Before
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivAfter` iv
y = IntervalRelation
After
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivMeets` iv
y = IntervalRelation
Meets
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivMetBy` iv
y = IntervalRelation
MetBy
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivOverlaps` iv
y = IntervalRelation
Overlaps
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivOverlappedBy` iv
y = IntervalRelation
OverlappedBy
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivStarts` iv
y = IntervalRelation
Starts
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivStartedBy` iv
y = IntervalRelation
StartedBy
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivFinishes` iv
y = IntervalRelation
Finishes
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivFinishedBy` iv
y = IntervalRelation
FinishedBy
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivDuring` iv
y = IntervalRelation
During
| iv
x iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
`ivContains` iv
y = IntervalRelation
Contains
| Bool
otherwise = IntervalRelation
Equals
ivBefore,
ivAfter ::
iv ->
iv ->
Bool
ivBefore iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
Before) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
ivAfter = (iv -> iv -> Bool) -> iv -> iv -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivBefore
ivMeets,
ivMetBy ::
iv ->
iv ->
Bool
ivMeets iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
Meets) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
ivMetBy = (iv -> iv -> Bool) -> iv -> iv -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivMeets
ivOverlaps,
ivOverlappedBy ::
iv ->
iv ->
Bool
ivOverlaps iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
Overlaps) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
ivOverlappedBy = (iv -> iv -> Bool) -> iv -> iv -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivOverlaps
ivStarts,
ivStartedBy ::
iv ->
iv ->
Bool
ivStarts iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
Starts) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
ivStartedBy = (iv -> iv -> Bool) -> iv -> iv -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivStarts
ivFinishes,
ivFinishedBy ::
iv ->
iv ->
Bool
ivFinishes iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
Finishes) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
ivFinishedBy = (iv -> iv -> Bool) -> iv -> iv -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivFinishes
ivDuring,
ivContains ::
iv ->
iv ->
Bool
ivDuring iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
During) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
ivContains = (iv -> iv -> Bool) -> iv -> iv -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip iv -> iv -> Bool
forall iv. Iv iv => iv -> iv -> Bool
ivDuring
ivEquals ::
iv ->
iv ->
Bool
ivEquals iv
x = (IntervalRelation -> IntervalRelation -> Bool
forall a. Eq a => a -> a -> Bool
== IntervalRelation
Equals) (IntervalRelation -> Bool)
-> (iv -> IntervalRelation) -> iv -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. iv -> iv -> IntervalRelation
forall iv. Iv iv => iv -> iv -> IntervalRelation
ivRelate iv
x
class PointedIv iv where
type Point iv
ivBegin, ivEnd :: iv -> Point iv
class (PointedIv iv) => SizedIv iv where
type Moment iv
moment :: Moment iv
duration :: iv -> Moment iv
ivExpandr, ivExpandl :: Moment iv -> iv -> iv
default moment :: (Num (Moment iv)) => Moment iv
moment = Moment iv
1
default duration :: (Point iv ~ Moment iv, Num (Point iv)) => iv -> Moment iv
duration iv
i = iv -> Point iv
forall iv. PointedIv iv => iv -> Point iv
ivEnd iv
i Moment iv -> Moment iv -> Moment iv
forall a. Num a => a -> a -> a
- iv -> Point iv
forall iv. PointedIv iv => iv -> Point iv
ivBegin iv
i
expand ::
(SizedIv (Interval a), Intervallic i) =>
Moment (Interval a) ->
Moment (Interval a) ->
i a ->
i a
expand :: Moment (Interval a) -> Moment (Interval a) -> i a -> i a
expand Moment (Interval a)
l Moment (Interval a)
r = Moment (Interval a) -> i a -> i a
forall a (i :: * -> *).
(SizedIv (Interval a), Intervallic i) =>
Moment (Interval a) -> i a -> i a
expandl Moment (Interval a)
l (i a -> i a) -> (i a -> i a) -> i a -> i a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment (Interval a) -> i a -> i a
forall a (i :: * -> *).
(SizedIv (Interval a), Intervallic i) =>
Moment (Interval a) -> i a -> i a
expandr Moment (Interval a)
r
expandl :: (SizedIv (Interval a), Intervallic i) => Moment (Interval a) -> i a -> i a
expandl :: Moment (Interval a) -> i a -> i a
expandl Moment (Interval a)
l i a
i = i a -> Interval a -> i a
forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
i (Interval a -> i a) -> Interval a -> i a
forall a b. (a -> b) -> a -> b
$ Moment (Interval a) -> Interval a -> Interval a
forall iv. SizedIv iv => Moment iv -> iv -> iv
ivExpandl Moment (Interval a)
l (Interval a -> Interval a) -> Interval a -> Interval a
forall a b. (a -> b) -> a -> b
$ i a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i a
i
expandr :: (SizedIv (Interval a), Intervallic i) => Moment (Interval a) -> i a -> i a
expandr :: Moment (Interval a) -> i a -> i a
expandr Moment (Interval a)
r i a
i = i a -> Interval a -> i a
forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
i (Interval a -> i a) -> Interval a -> i a
forall a b. (a -> b) -> a -> b
$ Moment (Interval a) -> Interval a -> Interval a
forall iv. SizedIv iv => Moment iv -> iv -> iv
ivExpandr Moment (Interval a)
r (Interval a -> Interval a) -> Interval a -> Interval a
forall a b. (a -> b) -> a -> b
$ i a -> Interval a
forall (i :: * -> *) a. Intervallic i => i a -> Interval a
getInterval i a
i
beginerval ::
forall a.
(SizedIv (Interval a)) =>
Moment (Interval a) ->
a ->
Interval a
beginerval :: Moment (Interval a) -> a -> Interval a
beginerval Moment (Interval a)
dur a
x = Moment (Interval a) -> Interval a -> Interval a
forall iv. SizedIv iv => Moment iv -> iv -> iv
ivExpandr Moment (Interval a)
dur (Interval a -> Interval a) -> Interval a -> Interval a
forall a b. (a -> b) -> a -> b
$ (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
x, a
x)
bi ::
forall a.
(SizedIv (Interval a)) =>
Moment (Interval a) ->
a ->
Interval a
bi :: Moment (Interval a) -> a -> Interval a
bi = Moment (Interval a) -> a -> Interval a
forall a.
SizedIv (Interval a) =>
Moment (Interval a) -> a -> Interval a
beginerval
enderval ::
forall a.
(SizedIv (Interval a)) =>
Moment (Interval a) ->
a ->
Interval a
enderval :: Moment (Interval a) -> a -> Interval a
enderval Moment (Interval a)
dur a
x = Moment (Interval a) -> Interval a -> Interval a
forall iv. SizedIv iv => Moment iv -> iv -> iv
ivExpandl Moment (Interval a)
dur (Interval a -> Interval a) -> Interval a -> Interval a
forall a b. (a -> b) -> a -> b
$ (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
x, a
x)
ei ::
forall a.
(SizedIv (Interval a)) =>
Moment (Interval a) ->
a ->
Interval a
ei :: Moment (Interval a) -> a -> Interval a
ei = Moment (Interval a) -> a -> Interval a
forall a.
SizedIv (Interval a) =>
Moment (Interval a) -> a -> Interval a
enderval
safeInterval ::
forall a.
(SizedIv (Interval a), Ord (Moment (Interval a))) =>
(a, a) ->
Interval a
safeInterval :: (a, a) -> Interval a
safeInterval (a
b, a
e)
| Interval a -> Moment (Interval a)
forall iv. SizedIv iv => iv -> Moment iv
duration Interval a
i Moment (Interval a) -> Moment (Interval a) -> Bool
forall a. Ord a => a -> a -> Bool
< Moment (Interval a)
m = Moment (Interval a) -> Interval a -> Interval a
forall iv. SizedIv iv => Moment iv -> iv -> iv
ivExpandr Moment (Interval a)
m (Interval a -> Interval a) -> Interval a -> Interval a
forall a b. (a -> b) -> a -> b
$ (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
b, a
b)
| Bool
otherwise = Interval a
i
where
i :: Interval a
i = (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
b, a
e)
m :: Moment (Interval a)
m = SizedIv (Interval a) => Moment (Interval a)
forall iv. SizedIv iv => Moment iv
moment @(Interval a)
si ::
(SizedIv (Interval a), Ord (Moment (Interval a))) =>
(a, a) ->
Interval a
si :: (a, a) -> Interval a
si = (a, a) -> Interval a
forall a.
(SizedIv (Interval a), Ord (Moment (Interval a))) =>
(a, a) -> Interval a
safeInterval
beginervalFromEnd ::
(SizedIv (Interval a), Intervallic i) =>
Moment (Interval a) ->
i a ->
Interval a
beginervalFromEnd :: Moment (Interval a) -> i a -> Interval a
beginervalFromEnd Moment (Interval a)
d i a
i = Moment (Interval a) -> a -> Interval a
forall a.
SizedIv (Interval a) =>
Moment (Interval a) -> a -> Interval a
beginerval Moment (Interval a)
d (i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
end i a
i)
endervalFromBegin ::
(SizedIv (Interval a), Intervallic i) =>
Moment (Interval a) ->
i a ->
Interval a
endervalFromBegin :: Moment (Interval a) -> i a -> Interval a
endervalFromBegin Moment (Interval a)
d i a
i = Moment (Interval a) -> a -> Interval a
forall a.
SizedIv (Interval a) =>
Moment (Interval a) -> a -> Interval a
enderval Moment (Interval a)
d (i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
begin i a
i)
beginervalMoment :: forall a. (SizedIv (Interval a)) => a -> Interval a
beginervalMoment :: a -> Interval a
beginervalMoment = Moment (Interval a) -> a -> Interval a
forall a.
SizedIv (Interval a) =>
Moment (Interval a) -> a -> Interval a
beginerval (SizedIv (Interval a) => Moment (Interval a)
forall iv. SizedIv iv => Moment iv
moment @(Interval a))
endervalMoment :: forall a. (SizedIv (Interval a)) => a -> Interval a
endervalMoment :: a -> Interval a
endervalMoment = Moment (Interval a) -> a -> Interval a
forall a.
SizedIv (Interval a) =>
Moment (Interval a) -> a -> Interval a
enderval (SizedIv (Interval a) => Moment (Interval a)
forall iv. SizedIv iv => Moment iv
moment @(Interval a))
extenterval :: (SizedIv (Interval a), Ord a, Intervallic i) => i a -> i a -> Interval a
extenterval :: i a -> i a -> Interval a
extenterval i a
x i a
y = (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
s, a
e)
where
s :: a
s = a -> a -> a
forall a. Ord a => a -> a -> a
min (i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
begin i a
x) (i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
begin i a
y)
e :: a
e = a -> a -> a
forall a. Ord a => a -> a -> a
max (i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
end i a
x) (i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
end i a
y)
shiftFromBegin ::
(Num a, SizedIv (Interval a), Intervallic i1, Intervallic i0) =>
i0 a ->
i1 a ->
i1 a
shiftFromBegin :: i0 a -> i1 a -> i1 a
shiftFromBegin i0 a
i = (a -> a) -> i1 a -> i1 a
forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone (\a
x -> a
x a -> a -> a
forall a. Num a => a -> a -> a
- i0 a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
begin i0 a
i)
shiftFromEnd ::
(Num a, SizedIv (Interval a), Intervallic i1, Intervallic i0) =>
i0 a ->
i1 a ->
i1 a
shiftFromEnd :: i0 a -> i1 a -> i1 a
shiftFromEnd i0 a
i = (a -> a) -> i1 a -> i1 a
forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone (\a
x -> a
x a -> a -> a
forall a. Num a => a -> a -> a
- i0 a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
end i0 a
i)
fromEnumInterval :: (Enum a, Intervallic i) => i a -> i Int
= (a -> Int) -> i a -> i Int
forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone a -> Int
forall a. Enum a => a -> Int
fromEnum
toEnumInterval :: (Enum a, Intervallic i) => i Int -> i a
toEnumInterval :: i Int -> i a
toEnumInterval = (Int -> a) -> i Int -> i a
forall (i :: * -> *) a b. Intervallic i => (a -> b) -> i a -> i b
imapStrictMonotone Int -> a
forall a. Enum a => Int -> a
toEnum
momentize ::
forall i a. (SizedIv (Interval a), Intervallic i) => i a -> i a
momentize :: i a -> i a
momentize i a
i = i a -> Interval a -> i a
forall (i :: * -> *) a b. Intervallic i => i a -> Interval b -> i b
setInterval i a
i (Interval a -> i a) -> Interval a -> i a
forall a b. (a -> b) -> a -> b
$ a -> Interval a
forall a. SizedIv (Interval a) => a -> Interval a
beginervalMoment (a -> Interval a) -> a -> Interval a
forall a b. (a -> b) -> a -> b
$ i a -> a
forall (i :: * -> *) a.
(SizedIv (Interval a), Intervallic i) =>
i a -> a
begin i a
i
type ComparativePredicateOf1 a = (a -> a -> Bool)
type ComparativePredicateOf2 a b = (a -> b -> Bool)
ivExpandrI ::
(Ord b) =>
b ->
(a -> a -> b) ->
(b -> a -> a) ->
b ->
Interval a ->
Interval a
ivExpandrI :: b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandrI b
mom a -> a -> b
dFun b -> a -> a
addFun b
d (Interval (a
b, a
e))
| b
d b -> b -> Bool
forall a. Ord a => a -> a -> Bool
< b
mom = (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
b, b -> a -> a
addFun (b -> b -> b
forall a. Ord a => a -> a -> a
max (a -> a -> b
dFun a
e a
b) b
mom) a
b)
| Bool
otherwise = (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (a
b, b -> a -> a
addFun b
d a
e)
ivExpandlI ::
(Ord b) =>
b ->
(a -> a -> b) ->
(b -> a -> a) ->
b ->
Interval a ->
Interval a
ivExpandlI :: b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandlI b
mom a -> a -> b
dFun b -> a -> a
subFun b
d (Interval (a
b, a
e))
| b
d b -> b -> Bool
forall a. Ord a => a -> a -> Bool
< b
mom = (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (b -> a -> a
subFun (b -> b -> b
forall a. Ord a => a -> a -> a
max (a -> a -> b
dFun a
e a
b) b
mom) a
e, a
e)
| Bool
otherwise = (a, a) -> Interval a
forall a. (a, a) -> Interval a
Interval (b -> a -> a
subFun b
d a
b, a
e)
instance (Ord a) => Ord (Interval a) where
(Interval (a, a)
pts1) <= :: Interval a -> Interval a -> Bool
<= (Interval (a, a)
pts2) = (a, a)
pts1 (a, a) -> (a, a) -> Bool
forall a. Ord a => a -> a -> Bool
<= (a, a)
pts2
(Interval (a, a)
pts1) < :: Interval a -> Interval a -> Bool
< (Interval (a, a)
pts2) = (a, a)
pts1 (a, a) -> (a, a) -> Bool
forall a. Ord a => a -> a -> Bool
< (a, a)
pts2
instance Intervallic Interval where
getInterval :: Interval a -> Interval a
getInterval = Interval a -> Interval a
forall a. a -> a
id
setInterval :: Interval a -> Interval b -> Interval b
setInterval Interval a
_ Interval b
x = Interval b
x
instance PointedIv (Interval a) where
type Point (Interval a) = a
ivBegin :: Interval a -> Point (Interval a)
ivBegin (Interval (a
b, a
_)) = a
Point (Interval a)
b
ivEnd :: Interval a -> Point (Interval a)
ivEnd (Interval (a
_, a
e)) = a
Point (Interval a)
e
instance (Ord a) => Iv (Interval a) where
ivBefore :: Interval a -> Interval a -> Bool
ivBefore Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y
ivMeets :: Interval a -> Interval a -> Bool
ivMeets Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y
ivOverlaps :: Interval a -> Interval a -> Bool
ivOverlaps Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y Bool -> Bool -> Bool
&& Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
y Bool -> Bool -> Bool
&& Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y
ivStarts :: Interval a -> Interval a -> Bool
ivStarts Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y Bool -> Bool -> Bool
&& Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
y
ivFinishes :: Interval a -> Interval a -> Bool
ivFinishes Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y Bool -> Bool -> Bool
&& Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
y
ivDuring :: Interval a -> Interval a -> Bool
ivDuring Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y Bool -> Bool -> Bool
&& Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
y
ivEquals :: Interval a -> Interval a -> Bool
ivEquals Interval a
x Interval a
y = Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivBegin Interval a
y Bool -> Bool -> Bool
&& Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval a -> Point (Interval a)
forall iv. PointedIv iv => iv -> Point iv
ivEnd Interval a
y
instance SizedIv (Interval Int) where
type Moment (Interval Int) = Int
ivExpandr :: Moment (Interval Int) -> Interval Int -> Interval Int
ivExpandr = Int
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> Int
-> Interval Int
-> Interval Int
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandrI (SizedIv (Interval Int) => Moment (Interval Int)
forall iv. SizedIv iv => Moment iv
moment @(Interval Int)) (-) Int -> Int -> Int
forall a. Num a => a -> a -> a
(+)
ivExpandl :: Moment (Interval Int) -> Interval Int -> Interval Int
ivExpandl = Int
-> (Int -> Int -> Int)
-> (Int -> Int -> Int)
-> Int
-> Interval Int
-> Interval Int
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandlI (SizedIv (Interval Int) => Moment (Interval Int)
forall iv. SizedIv iv => Moment iv
moment @(Interval Int)) (-) ((Int -> Int -> Int) -> Int -> Int -> Int
forall a b c. (a -> b -> c) -> b -> a -> c
flip (-))
instance SizedIv (Interval Integer) where
type Moment (Interval Integer) = Integer
ivExpandr :: Moment (Interval Integer) -> Interval Integer -> Interval Integer
ivExpandr = Integer
-> (Integer -> Integer -> Integer)
-> (Integer -> Integer -> Integer)
-> Integer
-> Interval Integer
-> Interval Integer
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandrI (SizedIv (Interval Integer) => Moment (Interval Integer)
forall iv. SizedIv iv => Moment iv
moment @(Interval Integer)) (-) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
(+)
ivExpandl :: Moment (Interval Integer) -> Interval Integer -> Interval Integer
ivExpandl = Integer
-> (Integer -> Integer -> Integer)
-> (Integer -> Integer -> Integer)
-> Integer
-> Interval Integer
-> Interval Integer
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandlI (SizedIv (Interval Integer) => Moment (Interval Integer)
forall iv. SizedIv iv => Moment iv
moment @(Interval Integer)) (-) ((Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
forall a b c. (a -> b -> c) -> b -> a -> c
flip (-))
instance SizedIv (Interval Double) where
type Moment (Interval Double) = Double
ivExpandr :: Moment (Interval Double) -> Interval Double -> Interval Double
ivExpandr = Double
-> (Double -> Double -> Double)
-> (Double -> Double -> Double)
-> Double
-> Interval Double
-> Interval Double
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandrI (SizedIv (Interval Double) => Moment (Interval Double)
forall iv. SizedIv iv => Moment iv
moment @(Interval Double)) (-) Double -> Double -> Double
forall a. Num a => a -> a -> a
(+)
ivExpandl :: Moment (Interval Double) -> Interval Double -> Interval Double
ivExpandl = Double
-> (Double -> Double -> Double)
-> (Double -> Double -> Double)
-> Double
-> Interval Double
-> Interval Double
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandlI (SizedIv (Interval Double) => Moment (Interval Double)
forall iv. SizedIv iv => Moment iv
moment @(Interval Double)) (-) ((Double -> Double -> Double) -> Double -> Double -> Double
forall a b c. (a -> b -> c) -> b -> a -> c
flip (-))
instance SizedIv (Interval DT.Day) where
type Moment (Interval DT.Day) = Integer
duration :: Interval Day -> Moment (Interval Day)
duration (Interval (Day
b, Day
e)) = Day -> Day -> Integer
diffDays Day
e Day
b
moment :: Moment (Interval Day)
moment = Moment (Interval Day)
1
ivExpandr :: Moment (Interval Day) -> Interval Day -> Interval Day
ivExpandr = Integer
-> (Day -> Day -> Integer)
-> (Integer -> Day -> Day)
-> Integer
-> Interval Day
-> Interval Day
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandrI (SizedIv (Interval Day) => Moment (Interval Day)
forall iv. SizedIv iv => Moment iv
moment @(Interval DT.Day)) Day -> Day -> Integer
diffDays Integer -> Day -> Day
addDays
ivExpandl :: Moment (Interval Day) -> Interval Day -> Interval Day
ivExpandl = Integer
-> (Day -> Day -> Integer)
-> (Integer -> Day -> Day)
-> Integer
-> Interval Day
-> Interval Day
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandlI (SizedIv (Interval Day) => Moment (Interval Day)
forall iv. SizedIv iv => Moment iv
moment @(Interval DT.Day)) Day -> Day -> Integer
diffDays (\Integer
d -> Integer -> Day -> Day
addDays (-Integer
d))
instance SizedIv (Interval DT.UTCTime) where
type Moment (Interval DT.UTCTime) = NominalDiffTime
moment :: Moment (Interval UTCTime)
moment = Int -> NominalDiffTime
forall a. Enum a => Int -> a
toEnum Int
1
duration :: Interval UTCTime -> Moment (Interval UTCTime)
duration (Interval (UTCTime
b, UTCTime
e)) = UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime UTCTime
e UTCTime
b
ivExpandr :: Moment (Interval UTCTime) -> Interval UTCTime -> Interval UTCTime
ivExpandr = NominalDiffTime
-> (UTCTime -> UTCTime -> NominalDiffTime)
-> (NominalDiffTime -> UTCTime -> UTCTime)
-> NominalDiffTime
-> Interval UTCTime
-> Interval UTCTime
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandrI (SizedIv (Interval UTCTime) => Moment (Interval UTCTime)
forall iv. SizedIv iv => Moment iv
moment @(Interval DT.UTCTime)) UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime NominalDiffTime -> UTCTime -> UTCTime
addUTCTime
ivExpandl :: Moment (Interval UTCTime) -> Interval UTCTime -> Interval UTCTime
ivExpandl = NominalDiffTime
-> (UTCTime -> UTCTime -> NominalDiffTime)
-> (NominalDiffTime -> UTCTime -> UTCTime)
-> NominalDiffTime
-> Interval UTCTime
-> Interval UTCTime
forall b a.
Ord b =>
b
-> (a -> a -> b) -> (b -> a -> a) -> b -> Interval a -> Interval a
ivExpandlI (SizedIv (Interval UTCTime) => Moment (Interval UTCTime)
forall iv. SizedIv iv => Moment iv
moment @(Interval DT.UTCTime)) UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime (\NominalDiffTime
d -> NominalDiffTime -> UTCTime -> UTCTime
addUTCTime (-NominalDiffTime
d))