Hallux.IntervalMap (Hallux v1.2.0) View Source
Interval maps implemented using Finger Trees.
A map of closed intervals can be used to find an interval that overlaps with a given interval in O(log(n)), and all m of them in O(m log(n/m)) time.
iex> im = Enum.into([
...> {{1, 2}, :a},
...> {{4, 10}, :b},
...> {{9, 15}, :c}
...> ], new())
iex> interval_search(im, {9, 10})
{:ok, {4, 10}, :b}
Link to this section Summary
Functions
(O(log n)). Insert an interval and associated value into a map.
The map may contain duplicate intervals; the new entry will be
inserted before any existing entries for the same interval.
(O(m log (n/m))). All intervals that intersect with the given
interval, in lexicographical order.
(O(log (n))). finds an interval overlapping with a given interval
in the above times, if such an interval exists.
(O(1)). Returns a new IntervalMap.
Link to this section Types
Specs
Specs
t(value) :: %Hallux.IntervalMap{
t: Hallux.Internal.FingerTree.t(Hallux.Internal.Interval.t(value))
}
Specs
value() :: term()
Link to this section Functions
Specs
(O(log n)). Insert an interval and associated value into a map.
The map may contain duplicate intervals; the new entry will be
inserted before any existing entries for the same interval.
An associated payload may be provided to be associated with the
interval. Defaults to nil.
Examples
iex> insert(new(), {1, 10}, :payload)
#HalluxIMap<[{{1, 10}, :payload}]>
Specs
interval_match(t(val), {integer(), integer()}) :: [ {{integer(), integer()}, val} ] when val: value()
(O(m log (n/m))). All intervals that intersect with the given
interval, in lexicographical order.
To check for intervals that contain a single point x, use {x, x}
as an interval.
Examples
iex> im = Enum.into([
...> {{1, 2}, :a},
...> {{4, 10}, :b},
...> {{9, 15}, :c}
...> ], new())
iex> interval_match(im, {2, 4})
[{{1, 2}, :a}, {{4, 10}, :b}]
iex> im = Enum.into([
...> {{1, 2}, :a},
...> {{4, 10}, :b},
...> {{9, 15}, :c}
...> ], new())
iex> interval_match(im, {16, 20})
[]
Specs
interval_search(t(val), {integer(), integer()}) :: {:ok, {integer(), integer()}, val} | {:error, :not_found} when val: value()
(O(log (n))). finds an interval overlapping with a given interval
in the above times, if such an interval exists.
Returns {:ok, {low, high}, payload} if found, {:error, :not_found} otherwise.
Examples
iex> im = Enum.into([
...> {{1, 2}, :a},
...> {{4, 10}, :b},
...> {{9, 15}, :c}
...> ], new())
iex> interval_search(im, {9, 10})
{:ok, {4, 10}, :b}
iex> im = Enum.into([
...> {{1, 2}, :a},
...> {{4, 10}, :b},
...> {{9, 15}, :c}
...> ], new())
iex> interval_search(im, {20, 30})
{:error, :not_found}
Specs
new() :: t()
(O(1)). Returns a new IntervalMap.
Examples
iex> new()
#HalluxIMap<[]>