View Source Orderly.SortedSet (orderly v0.1.0)
Implementation of a sorted set based on Erlang's
gb_sets.
SortedSet has many of the core functions found in
MapSet. The important difference
between SortedSet and MapSet is that the values in a sorted
set have a defined order, specifically the
Erlang term order.
For example:
set =
[2, 1, 3, 1]
|> SortedSet.new()
|> SortedSet.to_list()
#=> [1, 2, 3]All functions that involve accessing, inserting, or deleting an element have
O(log n) time complexity.
Like MapSet, SortedSet is an opaque data structure that does not support
pattern matching.
SortedSet implements the Enumerable protocol, so that Enum
functions can be applied to sorted sets. When applying Stream functions
to a sorted set, it is recommended to first create a stream using
SortedSet.to_stream/1 or SortedSet.to_stream/2, which adapts the effecient
lazy iterator pattern provided by gb_sets.
Summary
Functions
Delete value from sorted_set.
Obtain a set with the elements of sorted_set that are not contained in sorted_set2.
Check if two sorted sets are equal.
Obtain a set with elements in both sorted_set1 and sorted_set2.
Check if value is contained in sorted_set.
Create an empty set.
Create a new set from the given enumerable.
Insert value into sorted_set.
Return the number of elements in sorted_set.
Return the element with the smallest value in sorted_set.
Checks if all of the elements in sorted_set1 are contained in sorted_set2.
Convert sorted_set into a sorted list of elements.
Create a Stream from sorted_set
that emits elements in order starting from the smallest element in the set.
Create a Stream from sorted_set
that emits elements in order starting from the first element in the set
greater than or equal to start_value.
Obtain a set that contains all elements of sorted_set1 and sorted_set2.
Types
@type iter() :: :gb_sets.iter()
@type set(value) :: :gb_sets.set(value)
@type t(value) :: %Orderly.SortedSet{set: set(value)}
@type value() :: any()
Functions
Delete value from sorted_set.
This returns a set without value. If value is not present, the original
set is returned unchanged.
Examples
iex> set = Orderly.SortedSet.new([2, 1, 3])
iex> Orderly.SortedSet.delete(set, 2)
Orderly.SortedSet.new([1, 3])
iex> Orderly.SortedSet.delete(set, 4)
Orderly.SortedSet.new([1, 2, 3])
Obtain a set with the elements of sorted_set that are not contained in sorted_set2.
Examples
iex> set1 = Orderly.SortedSet.new([2, 1, 3])
iex> set2 = Orderly.SortedSet.new([1, 2])
iex> Orderly.SortedSet.difference(set1, set2) |> Orderly.SortedSet.to_list()
[3]
Check if two sorted sets are equal.
This checks the equality of the list representations.
Examples
iex> set1 = Orderly.SortedSet.new([2, 1, 3])
iex> set2 = Orderly.SortedSet.new([3, 2, 1])
iex> Orderly.SortedSet.equal?(set1, set2)
Obtain a set with elements in both sorted_set1 and sorted_set2.
Examples
iex> set1 = Orderly.SortedSet.new([2, 1, 3])
iex> set2 = Orderly.SortedSet.new([1, 2])
iex> Orderly.SortedSet.intersection(set1, set2) |> Orderly.SortedSet.to_list()
[1, 2]
Check if value is contained in sorted_set.
Examples
iex> set = Orderly.SortedSet.new([2, 1, 3])
iex> Orderly.SortedSet.member?(set, 2)
true
iex> Orderly.SortedSet.member?(set, 4)
false
@spec new() :: t()
Create an empty set.
Examples
iex> Orderly.SortedSet.new()
Orderly.SortedSet.new([])
@spec new(Enumerable.t()) :: t()
Create a new set from the given enumerable.
Examples
iex> Orderly.SortedSet.new([3, 1, 2])
Orderly.SortedSet.new([1, 2, 3])
iex> Orderly.SortedSet.new([{1, 2}, {2, 4}, {1, 3}])
Orderly.SortedSet.new([{1, 2}, {1, 3}, {2, 4}])
Insert value into sorted_set.
Examples
iex> Orderly.SortedSet.new() |> Orderly.SortedSet.put(1)
Orderly.SortedSet.new([1])
@spec size(t()) :: non_neg_integer()
Return the number of elements in sorted_set.
Examples
iex> Orderly.SortedSet.new([2, 1, 3]) |> Orderly.SortedSet.size()
3
Return the element with the smallest value in sorted_set.
This returns {:ok, value} if the set is non-empty, and :error otherwise.
Examples
iex> Orderly.SortedSet.new([2, 1, 3]) |> Orderly.SortedSet.smallest()
{:ok, 1}
iex> Orderly.SortedSet.new([]) |> Orderly.SortedSet.smallest()
:error
Checks if all of the elements in sorted_set1 are contained in sorted_set2.
Examples
iex> set1 = Orderly.SortedSet.new([2, 1, 3])
iex> set2 = Orderly.SortedSet.new([1, 2])
iex> Orderly.SortedSet.subset?(set2, set1)
true
Convert sorted_set into a sorted list of elements.
Examples
iex> Orderly.SortedSet.new([2, 1, 3]) |> Orderly.SortedSet.to_list()
[1, 2, 3]
@spec to_stream(t()) :: Enumerable.t()
Create a Stream from sorted_set
that emits elements in order starting from the smallest element in the set.
To generate values lazily, this uses
:gb_sets.iterator/1 and
:gb_sets.next/1.
Examples
iex> set = Orderly.SortedSet.new([2, 1, 3, 5, 4])
iex> stream = Orderly.SortedSet.to_stream(set)
iex> stream |> Enum.take(3)
[1, 2, 3]
iex> stream |> Enum.take_while(& &1 <= 4)
[1, 2, 3, 4]
@spec to_stream(t(), value()) :: Enumerable.t()
Create a Stream from sorted_set
that emits elements in order starting from the first element in the set
greater than or equal to start_value.
To generate values lazily, this uses
:gb_sets.iterator_from/2 and
:gb_sets.next/1.
Examples
iex> set = Orderly.SortedSet.new([2, 1, 3, 5, 4])
iex> stream = Orderly.SortedSet.to_stream(set, 2)
iex> stream |> Enum.take(3)
[2, 3, 4]
iex> stream |> Enum.take_while(& &1 <= 3)
[2, 3]
Obtain a set that contains all elements of sorted_set1 and sorted_set2.
Examples
iex> set1 = Orderly.SortedSet.new([2, 1, 3])
iex> set2 = Orderly.SortedSet.new([4, 5])
iex> Orderly.SortedSet.union(set1, set2) |> Orderly.SortedSet.to_list()
[1, 2, 3, 4, 5]