# View Source Interval.Behaviourbehaviour(Interval v0.3.4)

Defines the Interval behaviour. You'll usually want to use this behaviour by using

``use Interval, type: MyType``

# Link to this section Summary

## Callbacks

Is this implementation of an interval considered discrete?

Compare two points, returning if `a == b`, `a > b` or `a < b`.

Step a discrete point `n` steps.

Is the given argument a valid point in this Interval implementation.

Return the "size" of the interval. The returned value depends on the interval implementation used.

# new_opt()

View Source
```@type new_opt() ::
{:left, Interval.point()} | {:right, Interval.point()} | {:bounds, String.t()}```

# new_opts()

View Source
`@type new_opts() :: [new_opt()]`

# discrete?()

View Source
`@callback discrete?() :: boolean()`

Is this implementation of an interval considered discrete?

The interval is implicitly continuous if not discrete.

# new(new_opts)

View Source
`@callback new(new_opts()) :: Interval.t()`

Create a new `Interval.t/0`

# point_compare(point, point)

View Source
`@callback point_compare(Interval.point(), Interval.point()) :: :eq | :gt | :lt`

Compare two points, returning if `a == b`, `a > b` or `a < b`.

# point_step(point, n)

View Source
`@callback point_step(Interval.point(), n :: integer()) :: Interval.point()`

Step a discrete point `n` steps.

If `n` is negative, the point is stepped backwards. For integers this is simply addition (`point + n`)

# point_valid?(point)

View Source
`@callback point_valid?(Interval.point()) :: boolean()`

Is the given argument a valid point in this Interval implementation.

# size(t)

View Source
`@callback size(Interval.t()) :: any()`

Return the "size" of the interval. The returned value depends on the interval implementation used.

## for-discrete-intervals For Discrete Intervals

For discrete point types, the size represents the number of elements the interval contains.

I.e. for `Date` the size is the number of `Date` structs the interval can be said to "contain" (the number of days)

### examples Examples

``````iex> size(new(module: Interval.Integer, left: 1, right: 1, bounds: "[]"))
1

iex> size(new(module: Interval.Integer, left: 1, right: 3, bounds: "[)"))
2

# Note that this interval will be normalized to an empty interval
# due to the bounds:
iex> size(new(module: Interval.Integer, left: 1, right: 2, bounds: "()"))
0``````

## for-continuous-intervals For Continuous Intervals

For continuous intervals, the size is reported as the difference between the left and right points.

### examples-1 Examples

``````# The size of the interval `[1.0, 5.0)` is also 4:
iex> size(new(module: Interval.Float, left: 1.0, right: 5.0, bounds: "[)"))
4.0

# And likewise, so is the size of `[1.0, 5.0]` (note the bound change)
iex> size(new(module: Interval.Float, left: 1.0, right: 5.0, bounds: "[]"))
4.0

# Exactly one point contained in  this continuous interval,
# so technically not empty, but it also has zero  size.
iex> size(new(module: Interval.Float, left: 1.0, right: 1.0, bounds: "[]"))
0.0

# Empty continuous interval
iex> size(new(module: Interval.Float, left: 1.0, right: 1.0, bounds: "()"))
0.0``````