exqueue v0.1.2 FList View Source

FList a functional list implement using the efficient data structure of fingertree. Any operation in the front and the back is amortized O(1) and the operations involved randomly visiting are O(log n). We complete this work with some reference source files in Haskell from the project of AlgoXY, here we need to show our acknowledging. Now, FList can partly support the protocol of Enumerable and the protocol of Collectable. However, as there still remains a long way to go, the time complexity of these protocals are not assured. Therefore, if you need the assurance now, you’d better use the methods provided below. These methods will be reserved in the future though the protocols are getting better implements in the next version of this module. FList can be inspected in a pretty-looking way, which is shown below:

Examples

iex> [1, 2, 3, 4] |> FList.fromList()
#FList<[1, 2, 3, 4]>

You can run mix test first to check whether the implement is working well.

Link to this section Summary

Types

t()

FList.t stands for the FList

Functions

Concat two FLists

Add a new element to the front.

Examples

Get a new list without the element at the pointed position

Invoked in order to access the value stored under key in the given term term

Generate a FList from the given normal list

Invoked in order to access the value stored under key in the given term term, defaulting to default if not present

Get the element at the pointed position from a FList

Invoked in order to access the value under key and update it at the same time

Get the front element

Get a new list without the back element

Get the back element

Get a new list with the element at the pointed position moved to the front

Generate a FList from the given FTree. If the tree is not provided, a empty list will be generated

Invoked to “pop” the value under key out of the given term

Update the value of the element at the pointed position

Get the size of a FList

Add a new element to the back

Split a FList at the pointed position

Get a new list without the front elemeny

Turn a FList into a normal list

Pop the front element, and then return a tuple

Pop the back element, and then return a tuple

Link to this section Types

FList.t stands for the FList.

Link to this section Functions

Link to this function concat(a, b) View Source
concat(t, t) :: t

Concat two FLists.

Link to this function cons(list, x) View Source
cons(t, any) :: t

Add a new element to the front.

Examples

iex> FList.new() |> FList.cons(0)
#FList<[0]>
Link to this function extractAt(list, x) View Source
extractAt(t, non_neg_integer) :: {any, t}

Get a new list without the element at the pointed position.

Invoked in order to access the value stored under key in the given term term.

This function should return {:ok, value} where value is the value under key if it succeeded, or :error if the key does not exist in the structure.

Many of the functions defined in the Access module internally call this function. This function is also used when the square-brackets access syntax (structure[key]) is used: the fetch/2 callback implemented by the module that defines the structure struct is invoked and if it returns {:ok, value} then value is returned, or if it returns :error then nil is returned.

See the Map.fetch/2 and Keyword.fetch/2 implementations for examples of how to implement this callback.

Callback implementation for Access.fetch/2.

Link to this function fromList(originalList) View Source
fromList(list) :: t

Generate a FList from the given normal list.

Invoked in order to access the value stored under key in the given term term, defaulting to default if not present.

This function should return the value under the key key in term if there’s such key, otherwise default.

For most data structures, this can be implemented using fetch/2 internally; for example:

def get(structure, key, default) do
  case fetch(structure, key) do
    {:ok, value} -> value
    :error       -> default
  end
end

See the Map.get/3 and Keyword.get/3 implementations for more examples.

Callback implementation for Access.get/3.

Link to this function getAt(list, x) View Source
getAt(t, non_neg_integer) :: any

Get the element at the pointed position from a FList.

Link to this function get_and_update(term, key, fun) View Source

Invoked in order to access the value under key and update it at the same time.

The implementation of this callback should invoke the passed function with the value under key key in the passed structure, or nil if the key is not present. This function should return either {value_to_return, new_value} or :pop.

If it returns {value_to_return, new_value}, the return value of this callback should be {value_to_return, new_term} where new_term is term after updating the value of key with new_value.

If it returns :pop, the return value of this callback should be {value, new_term} where value is the value under key or nil if not present, and new_term is term without the key key.

See the implementations of Map.get_and_update/3 or Keyword.get_and_update/3 for more examples.

Callback implementation for Access.get_and_update/3.

Get the front element.

Get a new list without the back element.

Get the back element.

Link to this function moveToFront(list, x) View Source
moveToFront(t, non_neg_integer) :: t

Get a new list with the element at the pointed position moved to the front.

Generate a FList from the given FTree. If the tree is not provided, a empty list will be generated.

Invoked to “pop” the value under key out of the given term.

When the key key exists in the given term, the implementation should return a {value, new_term} tuple where value is the value that was under key and new_term is term without key.

When the key key is not present in the given term, a tuple {value, term} should be returned, where value is implementation-defined.

See the implementations for Map.pop/3 or Keyword.pop/3 for more examples.

Callback implementation for Access.pop/2.

Link to this function setAt(list, x, ele) View Source
setAt(t, non_neg_integer, any) :: t

Update the value of the element at the pointed position.

Link to this function size(list) View Source
size(t) :: non_neg_integer

Get the size of a FList.

Link to this function snoc(list, x) View Source
snoc(t, any) :: t

Add a new element to the back.

Link to this function splitAt(list, x) View Source
splitAt(t, non_neg_integer) :: {t, any, t}

Split a FList at the pointed position.

Get a new list without the front elemeny.

Link to this function toList(list) View Source
toList(t) :: list

Turn a FList into a normal list.

Link to this function uncons(list) View Source
uncons(t) :: {any, t}

Pop the front element, and then return a tuple.

Link to this function unsnoc(list) View Source
unsnoc(t) :: {t, any}

Pop the back element, and then return a tuple.