Tuple

Functions for working with tuples.

Tuples are ordered collection of elements; tuples can contain elements of any type, and a tuple can contain elements of different types. Curly braces can be used to create tuples:

iex> {}
{}
iex> {1, :two, "three"}
{1, :two, "three"}

Tuples store elements contiguously in memory; this means that accessing a tuple element by index (which can be done through the Kernel.elem/2 function) is a constant-time operation:

iex> tuple = {1, :two, "three"}
iex> elem(tuple, 0)
1
iex> elem(tuple, 2)
"three"

Same goes for getting the tuple size (via Kernel.tuple_size/1):

iex> tuple_size({})
0
iex> tuple_size({1, 2, 3})
3

Tuples being stored contiguously in memory also means that updating a tuple (for example replacing an element with Kernel.put_elem/3) will make a copy of the whole tuple.

Tuples are not meant to be used as a “collection” type (which is also suggested by the absence of an implementation of the Enumerable protocol for tuples): they’re mostly meant to be used as a fixed-size container for multiple elements. For example, tuples are often used to have functions return “enriched” values: a common pattern is for functions to return {:ok, value} for successful cases and {:error, reason} for unsuccessful cases. For example, this is exactly what File.read/1 does: it returns {:ok, contents} if reading the given file is successful, or {:error, reason} otherwise (e.g., {:error, :enoent} if the file doesn’t exist).

This module provides functions to work with tuples; some more functions to work with tuples can be found in Kernel (Kernel.tuple_size/1, Kernel.elem/2, Kernel.put_elem/3, and others).

Summary

Functions

append(tuple, value)

Inserts an element at the end of a tuple

delete_at(tuple, index)

Removes an element from a tuple

duplicate(data, size)

Creates a new tuple

insert_at(tuple, index, value)

Inserts an element into a tuple

to_list(tuple)

Converts a tuple to a list

Functions

append(tuple, value)

append(tuple(), term()) :: tuple()

Inserts an element at the end of a tuple.

Returns a new tuple with the element appended at the end, and contains the elements in tuple followed by value as the last element.

Inlined by the compiler.

Examples

iex> tuple = {:foo, :bar}
iex> Tuple.append(tuple, :baz)
{:foo, :bar, :baz}

delete_at(tuple, index)

delete_at(tuple(), non_neg_integer()) :: tuple()

Removes an element from a tuple.

Deletes the element at the given index from tuple. Raises an ArgumentError if index is negative or greater than or equal to the length of tuple. Index is zero-based.

Inlined by the compiler.

Examples

iex> tuple = {:foo, :bar, :baz}
iex> Tuple.delete_at(tuple, 0)
{:bar, :baz}

duplicate(data, size)

duplicate(term(), non_neg_integer()) :: tuple()

Creates a new tuple.

Creates a tuple of size containing the given data at every position.

Inlined by the compiler.

Examples

iex> Tuple.duplicate(:hello, 3)
{:hello, :hello, :hello}

insert_at(tuple, index, value)

insert_at(tuple(), non_neg_integer(), term()) :: tuple()

Inserts an element into a tuple.

Inserts value into tuple at the given index. Raises an ArgumentError if index is negative or greater than the length of tuple. Index is zero-based.

Inlined by the compiler.

Examples

iex> tuple = {:bar, :baz}
iex> Tuple.insert_at(tuple, 0, :foo)
{:foo, :bar, :baz}
iex> Tuple.insert_at(tuple, 2, :bong)
{:bar, :baz, :bong}

to_list(tuple)

to_list(tuple()) :: list()

Converts a tuple to a list.

Returns a new list with all the tuple elements.

Inlined by the compiler.

Examples

iex> tuple = {:foo, :bar, :baz}
iex> Tuple.to_list(tuple)
[:foo, :bar, :baz]

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.4.5/Tuple.html