| Copyright | (c) NoviSci Inc 2020 |
|---|---|
| License | BSD3 |
| Maintainer | bsaul@novisci.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
IntervalAlgebra
Description
The IntervalAlgebra module provides data types and related classes for the
interval-based temporal logic described in Allen (1983)
and axiomatized in Allen and Hayes (1987).
A good primer on Allen's algebra can be found here.
Design
The module is built around five typeclasses designed to separate concerns of
constructing, relating, and combining s: Interval
provides an interface to the data structure of anIntervallic, defining how anIntervalis constructed.Intervalaprovides an interface to theIntervalAlgebraic, the workhorse of Allen's temporal logic.IntervalRelationsprovides an interface to methods of combining twoIntervalCombinable.Intervalsand the relatedIntervalSizeableprovides methods for measuring and modifying the size of an interval.Momentprovides methods for filteringIntervalFilterableFilterablecollections of intervals.
An advantage of nested typeclass design is that developers can define an
of type Intervala with just the amount of structure that they need.
Total Ordering of Intervals
The modules makes the (opinionated) choice of a total ordering for Intervallics. Namely, the ordering is based on first ordering the Intervalbegins
then the ends.
Development
This module is under development and the API may change in the future.
Synopsis
- class (Ord a, Show a) => Intervallic a where
- parseInterval :: a -> a -> Either String (Interval a)
- unsafeInterval :: a -> a -> Interval a
- begin, end :: Interval a -> a
- class (Eq a, Intervallic a) => IntervalAlgebraic a where
- relate :: Interval a -> Interval a -> IntervalRelation
- equals :: ComparativePredicateOf (Interval a)
- meets, metBy :: ComparativePredicateOf (Interval a)
- before, after :: ComparativePredicateOf (Interval a)
- overlaps, overlappedBy :: ComparativePredicateOf (Interval a)
- starts, startedBy :: ComparativePredicateOf (Interval a)
- finishes, finishedBy :: ComparativePredicateOf (Interval a)
- during, contains :: ComparativePredicateOf (Interval a)
- composeRelations :: [ComparativePredicateOf (Interval a)] -> ComparativePredicateOf (Interval a)
- disjoint :: ComparativePredicateOf (Interval a)
- notDisjoint :: ComparativePredicateOf (Interval a)
- in' :: ComparativePredicateOf (Interval a)
- class IntervalAlgebraic a => IntervalCombinable a where
- class (Intervallic a, Num b, Ord b) => Moment a b | a -> b where
- moment :: b
- class (Intervallic a, Moment a b, Num b, Ord b) => IntervalSizeable a b | a -> b where
- class (Filterable f, IntervalAlgebraic a) => IntervalFilterable f a where
- filterMaker :: ComparativePredicateOf (Interval a) -> Interval a -> f (Interval a) -> f (Interval a)
- filterOverlaps :: Interval a -> f (Interval a) -> f (Interval a)
- filterOverlappedBy :: Interval a -> f (Interval a) -> f (Interval a)
- filterBefore :: Interval a -> f (Interval a) -> f (Interval a)
- filterAfter :: Interval a -> f (Interval a) -> f (Interval a)
- filterMeets :: Interval a -> f (Interval a) -> f (Interval a)
- filterMetBy :: Interval a -> f (Interval a) -> f (Interval a)
- filterDuring :: Interval a -> f (Interval a) -> f (Interval a)
- filterContains :: Interval a -> f (Interval a) -> f (Interval a)
- filterDisjoint :: Interval a -> f (Interval a) -> f (Interval a)
- filterNotDisjoint :: Interval a -> f (Interval a) -> f (Interval a)
- filterIn' :: Interval a -> f (Interval a) -> f (Interval a)
- data Interval a
- data IntervalRelation
- type ComparativePredicateOf a = a -> a -> Bool
Classes
class (Ord a, Show a) => Intervallic a where Source #
The typeclass specifies how an Intervallics is constructed.
It also includes functions for getting the Interval a and begin of an end.Interval a
Minimal complete definition
Nothing
Methods
parseInterval :: a -> a -> Either String (Interval a) Source #
Safely parse a pair of as to create an .Interval a
unsafeInterval :: a -> a -> Interval a Source #
Create a new . This function is not safe as it does
not enforce that \(x < y\). Use with caution. It is meant to be helper
function in early prototyping of this package. This function may be
deprecated in future releases.Interval a
begin :: Interval a -> a Source #
Access the ends of an .Interval a
end :: Interval a -> a Source #
Access the ends of an .Interval a
Instances
class (Eq a, Intervallic a) => IntervalAlgebraic a where Source #
The typeclass specifies the functions and relational
operators for interval-based temporal logic. The typeclass defines the
relational operators for intervals, plus other useful utilities such as
IntervalAlgebraic, disjoint, and in'.composeRelations
Minimal complete definition
Nothing
Methods
relate :: Interval a -> Interval a -> IntervalRelation Source #
Compare two intervals to determine their IntervalRelation.
equals :: ComparativePredicateOf (Interval a) Source #
Does x equal y?
meets :: ComparativePredicateOf (Interval a) Source #
Does x meet y? Is y metBy x?
metBy :: ComparativePredicateOf (Interval a) Source #
Does x meet y? Is y metBy x?
before :: ComparativePredicateOf (Interval a) Source #
Is x before y? Is x after y?
after :: ComparativePredicateOf (Interval a) Source #
Is x before y? Is x after y?
overlaps :: ComparativePredicateOf (Interval a) Source #
Does x overlap y? Is x overlapped by y?
overlappedBy :: ComparativePredicateOf (Interval a) Source #
Does x overlap y? Is x overlapped by y?
starts :: ComparativePredicateOf (Interval a) Source #
Does x start y? Is x started by y?
startedBy :: ComparativePredicateOf (Interval a) Source #
Does x start y? Is x started by y?
finishes :: ComparativePredicateOf (Interval a) Source #
Does x finish y? Is x finished by y?
finishedBy :: ComparativePredicateOf (Interval a) Source #
Does x finish y? Is x finished by y?
during :: ComparativePredicateOf (Interval a) Source #
Is x during y? Does x contain y?
contains :: ComparativePredicateOf (Interval a) Source #
Is x during y? Does x contain y?
composeRelations :: [ComparativePredicateOf (Interval a)] -> ComparativePredicateOf (Interval a) Source #
Compose a list of interval relations with _or_ to create a new
. For example,
ComparativePredicateOf Interval acomposeRelations [before, meets] creates a predicate function determining
if one interval is either before or meets another interval.
disjoint :: ComparativePredicateOf (Interval a) Source #
notDisjoint :: ComparativePredicateOf (Interval a) Source #
Are x and y not disjoint; i.e. do they share any support?
in' :: ComparativePredicateOf (Interval a) Source #
Instances
class IntervalAlgebraic a => IntervalCombinable a where Source #
The typeclass provides methods for (possibly) combining
two IntervalCombinable.Intervals
Minimal complete definition
Nothing
Methods
(.+.) :: Interval a -> Interval a -> Maybe (Interval a) Source #
extenterval :: Interval a -> Interval a -> Interval a Source #
Creates a new Interval spanning the extent x and y
(><) :: Interval a -> Interval a -> Maybe (Interval a) Source #
If x is before y, then form a new Just Interval a from the
interval in the "gap" between x and y from the end of x to the
begin of y. Otherwise, Nothing.
(<+>) :: (Semigroup (f (Interval a)), Applicative f) => Interval a -> Interval a -> f (Interval a) Source #
If x is before y, return f x appended to f y. Otherwise,
return extenterval of x and y (wrapped in f). This is useful for
folding over an *ordered* container of Intervals and combining intervals
when x is *not* before y.
Instances
class (Intervallic a, Num b, Ord b) => Moment a b | a -> b where Source #
The Moment class fixes the smallest duration of an 'Intervallic a'.
Minimal complete definition
Nothing
class (Intervallic a, Moment a b, Num b, Ord b) => IntervalSizeable a b | a -> b where Source #
The IntervalSizeable typeclass provides functions to determine the size of
and to resize an 'Interval a'.
Methods
duration :: Interval a -> b Source #
Determine the duration of an 'Interval a'.
Shifts an a. Most often, the b will be the same type as a.
But for example, if a is Day then b could be Int.
Takes the difference between two a to return a b.
expand :: b -> b -> Interval a -> Interval a Source #
Resize an 'Interval a' to by expanding to "left" by max l moment
and to the "right" by min r moment.
expandl :: b -> Interval a -> Interval a Source #
Expands an 'Interval a' to left by i.
expandr :: b -> Interval a -> Interval a Source #
Expands an 'Interval a' to right by i.
beginerval :: b -> a -> Interval a Source #
Instances
class (Filterable f, IntervalAlgebraic a) => IntervalFilterable f a where Source #
The class provides functions for filtering IntervalFilterableFilterables of
s based on Interval relations.IntervalAlgebraic
Minimal complete definition
Nothing
Methods
filterMaker :: ComparativePredicateOf (Interval a) -> Interval a -> f (Interval a) -> f (Interval a) Source #
Creates a function for filtering a Filterable of Interval as based on a predicate
filterOverlaps :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those that overlaps the Interval a
in the first argument.
filterOverlappedBy :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those overlappedBy the Interval a
in the first argument.
filterBefore :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those before the Interval a
in the first argument.
filterAfter :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those after the Interval a
in the first argument.
filterMeets :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those that meets the Interval a
in the first argument.
filterMetBy :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those metBy the Interval a
in the first argument.
filterDuring :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those during the Interval a
in the first argument.
filterContains :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those that contains
the Interval a in the first argument.
filterDisjoint :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those that are disjoint
from the Interval a in the first argument.
filterNotDisjoint :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those that are notDisjoint
from the Interval a in the first argument.
filterIn' :: Interval a -> f (Interval a) -> f (Interval a) Source #
Filter a Filterable of Interval as to those that are in'
the Interval a in the first argument.
Instances
Types
An is a pair of Interval aas \( (x, y) \text{ where } x < y\). The
class provides a safe Intervallic function that returns a
parseInterval error if \(y < x\) and LeftunsafeInterval as constructor for creating an
interval that may not be valid.
Instances
| Eq a => Eq (Interval a) Source # | |
| Intervallic a => Ord (Interval a) Source # | Imposes a total ordering on |
| (Intervallic a, Show a) => Show (Interval a) Source # | |
| Arbitrary (Interval Int) Source # | |
| Arbitrary (Interval Day) Source # | |
data IntervalRelation Source #
The IntervalRelation type enumerates the thirteen possible ways that two
objects can relate according to the interval algebra.Interval a
Meets, Metby
x `meets` y y `metBy` x
x: |-----| y: |-----|
Before, After
x `before` y y `after` x
x: |-----| y: |-----|
Overlaps, OverlappedBy
x `overlaps` y y `overlappedBy` x
x: |-----| y: |-----|
Starts, StartedBy
x `starts` y y `startedBy` x
x: |---| y: |-----|
Finishes, FinishedBy
x `finishes` y y `finishedBy` x
x: |---| y: |-----|
During, Contains
x `during` y y `contains` x
x: |-| y: |-----|
Equal
x `equal` y y `equal` x
x: |-----| y: |-----|
Instances
| Read IntervalRelation Source # | |
Defined in IntervalAlgebra Methods readsPrec :: Int -> ReadS IntervalRelation # readList :: ReadS [IntervalRelation] # | |
| Show IntervalRelation Source # | |
Defined in IntervalAlgebra Methods showsPrec :: Int -> IntervalRelation -> ShowS # show :: IntervalRelation -> String # showList :: [IntervalRelation] -> ShowS # | |
type ComparativePredicateOf a = a -> a -> Bool Source #
Defines a predicate of two objects of type a.