Перечисление
Предоставляет набор алгоритмов, перечисляющих перечислимые объекты согласно протоколу Enumerable.
iex> Enum.map([1, 2, 3], fn(x) -> x * 2 end) [2, 4, 6]
Некоторые типы, такие как карты, генерируют специфический формат при перечислении. Например, аргументом всегда является кортеж {key, value} для карт:
iex> map = %{a: 1, b: 2}
iex> Enum.map(map, fn {k, v} -> {k, v * 2} end)
[a: 2, b: 4] Обратите внимание, что функции в модуле Enum являются неленивыми: они всегда начинают перечисление заданного перечислимого объекта. Модуль Stream позволяет ленивое перечисление перечислимых объектов и предоставляет бесконечные потоки.
Поскольку большинство функций в модуле Enum перечисляют весь перечислимый объект и возвращают список в качестве результата, бесконечные потоки необходимо использовать с осторожностью, так как они могут потенциально работать вечно. Например:
Enum.each Stream.cycle([1, 2, 3]), &IO.puts(&1)
Краткое описание
Типы
- default()
- element()
- index()
- t()
Функции
- all?(enumerable, fun \\ fn x -> x end)
-
Возвращает true, если заданная
funвозвращает true для всех элементов в перечисляемом объекте - any?(enumerable, fun \\ fn x -> x end)
-
Возвращает true, если заданная
funвозвращает true для любого из элементов в перечисляемом объекте - at(enumerable, index, default \\ nil)
-
Находит элемент по заданному
index(нумерация с нуля) - chunk(enumerable, count)
-
Сокращение для
chunk(enumerable, count, count) - chunk(enumerable, count, step, leftover \\ nil)
-
Возвращает список списков, содержащих
countэлементов каждый, где каждый новый блок начинается черезstepэлементы в перечисляемом объекте - chunk_by(enumerable, fun)
-
Разбивает перечисляемый объект на группы по каждому элементу, для которого
funвозвращает новое значение - concat(enumerables)
-
Принимая перечисляемый объект перечисляемых объектов, склеивает перечисляемые объекты в один список
- concat(left, right)
-
Склеивает перечисляемый объект справа с перечисляемым объектом слева
- count(enumerable)
-
Возвращает размер перечисляемого объекта
- count(enumerable, fun)
-
Возвращает количество элементов в перечисляемом объекте, для которых
funвозвращает истинное значение - dedup(enumerable)
-
Перечисляет
enumerable, возвращая список, где все последовательные дублированные элементы сводятся к одному элементу - dedup_by(enumerable, fun)
-
Перечисляет
enumerable, возвращая список, где все последовательные дублированные элементы сводятся к одному элементу - drop(enumerable, amount)
-
Опускает
amountэлементов из перечисляемого объекта - drop_every(enumerable, nth)
-
Возвращает список, содержащий каждый
nthэлемент перечисляемого объекта, пропущенный, начиная с первого элемента - drop_while(enumerable, fun)
-
Опускает элементы в начале перечисляемого объекта, пока
funвозвращает истинное значение - each(enumerable, fun)
-
Вызывает заданную
funдля каждого элемента в перечисляемом объекте - empty?(enumerable)
-
Определяет, пуст ли перечисляемый объект
- fetch(enumerable, index)
-
Находит элемент по заданному
index(нумерация с нуля) - fetch!(enumerable, index)
-
Находит элемент по заданному
index(нумерация с нуля) - filter(enumerable, fun)
-
Фильтрует перечисляемый объект, т.е. возвращает только те элементы, для которых
funвозвращает истинное значение - filter_map(enumerable, filter, mapper)
-
Фильтрует перечисляемый объект и отображает его элементы за один проход
- find(enumerable, default \\ nil, fun)
-
Возвращает первый элемент, для которого
funвозвращает истинное значение. Если такой элемент не найден, возвращаетdefault - find_index(enumerable, fun)
-
Аналогично
find/3, но возвращает индекс (нумерация с нуля) элемента вместо самого элемента - find_value(enumerable, default \\ nil, fun)
-
Аналогично
find/3, но возвращает значение вызова функции вместо самого элемента - flat_map(enumerable, fun)
-
Возвращает новый перечисляемый объект, добавляя результат вызова
funдля каждого соответствующего элементаenumerable - flat_map_reduce(enumerable, acc, fun)
-
Отображает и сводит перечисляемый объект, сглаживая полученные результаты (только на один уровень глубины)
- group_by(enumerable, key_fun, value_fun \\ fn x -> x end)
-
Разбивает перечисляемый объект на группы на основе
key_fun - intersperse(enumerable, element)
-
Вставляет
elementмежду каждым элементом перечисления - into(enumerable, collectable)
-
Вставляет данный
enumerableвcollectable - into(enumerable, collectable, transform)
-
Вставляет данный
enumerableвcollectableв соответствии с функцией преобразования - join(enumerable, joiner \\ "")
-
Объединяет заданный перечисляемый объект в строку, используя
joinerв качестве разделителя - map(enumerable, fun)
-
Возвращает список, где каждый элемент является результатом вызова
funдля каждого соответствующего элементаenumerable - map_every(enumerable, nth, fun)
-
Возвращает список результатов вызова
funдля каждогоnthэлементаenumerable, начиная с первого элемента - map_join(enumerable, joiner \\ "", mapper)
-
Отображает и объединяет заданный перечисляемый объект за один проход
- map_reduce(enumerable, acc, fun)
-
Вызывает заданную функцию для каждого элемента в перечисляемом объекте, чтобы свести его к одному элементу, сохраняя накопитель
- max(enumerable, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
-
Возвращает максимальный элемент в перечисляемом объекте в соответствии с порядком Эрланга
- max_by(enumerable, fun, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
-
Возвращает максимальный элемент в перечисляемом объекте, рассчитанный заданной функцией
- member?(enumerable, element)
-
Проверяет, существует ли
elementв перечисляемом объекте - min(enumerable, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
-
Возвращает минимальный элемент в перечисляемом объекте в соответствии с порядком Эрланга
- min_by(enumerable, fun, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
-
Возвращает минимальный элемент в перечисляемом объекте, рассчитанный заданной функцией
- min_max(enumerable, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
-
Возвращает кортеж с минимальным и максимальным элементами в перечисляемом объекте в соответствии с порядком Эрланга
- min_max_by(enumerable, fun, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
-
Возвращает кортеж с минимальным и максимальным элементами в перечисляемом объекте, рассчитанными заданной функцией
- random(enumerable)
-
Возвращает случайный элемент перечисляемого объекта
- reduce(enumerable, fun)
-
Вызывает
funдля каждого элемента вenumerable, передавая этот элемент и накопитель в качестве аргументов. Значение, возвращаемоеfun, сохраняется в накопителе - reduce(enumerable, acc, fun)
-
Вызывает
funдля каждого элемента вenumerable, передавая этот элемент и накопительaccв качестве аргументов. Значение, возвращаемоеfun, сохраняется вacc - reduce_while(enumerable, acc, fun)
-
Сводит перечисляемый объект, пока
funвозвращает{:halt, term} - reject(enumerable, fun)
-
Возвращает элементы
enumerableдля которых функцияfunвозвращаетfalseилиnil - reverse(enumerable)
-
Возвращает список элементов в
enumerableв обратном порядке - reverse(enumerable, tail)
-
Инвертирует элементы в
enumerable, добавляет хвост и возвращает его в виде списка - reverse_slice(enumerable, start, count)
-
Обращает итерируемый объект в диапазоне от начальной позиции
startдоcountэлементов - scan(enumerable, fun)
-
Применяет заданную функцию к каждому элементу в итерируемом объекте, сохраняя результат в списке и передавая его в качестве накопителя для следующего вычисления
- scan(enumerable, acc, fun)
-
Применяет заданную функцию к каждому элементу в итерируемом объекте, сохраняя результат в списке и передавая его в качестве накопителя для следующего вычисления. Использует заданное значение
accв качестве начального значения - shuffle(enumerable)
-
Возвращает список со случайным порядком элементов
enumerable - slice(enumerable, range)
-
Возвращает подмножество списка из данного итерируемого объекта, с
range.firstпоrange.lastпозиции - slice(enumerable, start, amount)
-
Возвращает подмножество списка из данного итерируемого объекта, начиная с позиции
startсamountэлементов, если доступно - sort(enumerable)
-
Сортирует итерируемый объект в соответствии с порядком терминов Erlang
- sort(enumerable, fun)
-
Сортирует итерируемый объект по заданной функции
- sort_by(enumerable, mapper, sorter \\ &<=/2)
-
Сортирует результаты отображения итерируемого объекта в соответствии с предоставленной
sorterфункцией - split(enumerable, count)
-
Разделяет
enumerableна два итерируемых объекта, оставляяcountэлементов в первом - split_while(enumerable, fun)
-
Разделяет итерируемый объект на две части в позиции элемента, для которого
funвозвращаетfalseв первый раз - split_with(enumerable, fun)
-
Разделяет
enumerableна два списка в соответствии с заданной функциейfun - sum(enumerable)
-
Возвращает сумму всех элементов
- take(enumerable, count)
-
Берет первые
countэлементы из итерируемого объекта - take_every(enumerable, nth)
-
Возвращает список каждого
nthэлемента в итерируемом объекте, начиная с первого элемента - take_random(enumerable, count)
-
Берет
countслучайных элементов изenumerable - take_while(enumerable, fun)
-
Берет элементы с начала итерируемого объекта, пока
funвозвращает истинное значение - to_list(enumerable)
-
Преобразует
enumerableв список - uniq(enumerable)
-
Итерирует
enumerable, удаляя все повторяющиеся элементы - uniq_by(enumerable, fun)
-
Итерирует
enumerable, удаляя элементы, для которых функцияfunвозвратила повторяющиеся элементы - unzip(enumerable)
-
Обратное
Enum.zip/2; извлекает пары элементов из итерируемого объекта и группирует их вместе - with_index(enumerable, offset \\ 0)
-
Возвращает итерируемый объект с каждым элементом, заключенным в кортеж вместе с его индексом
- zip(enumerables)
-
Объединяет соответствующие элементы из коллекции итерируемых объектов в один список кортежей
- zip(enumerable1, enumerable2)
-
Объединяет соответствующие элементы из двух итерируемых объектов в один список кортежей
Типы
default()
default() :: any()
element()
element() :: any()
index()
index() :: integer()
t()
t() :: Enumerable.t()
Функции
all?(enumerable, fun \\ fn x -> x end)
all?(t(), (element() -> as_boolean(term()))) :: boolean()
Возвращает true, если заданное fun вычисляет true для всех элементов в итерируемом объекте.
Останавливает итерацию при первом вызове, который возвращает false или nil.
Примеры
iex> Enum.all?([2, 4, 6], fn(x) -> rem(x, 2) == 0 end) true iex> Enum.all?([2, 3, 4], fn(x) -> rem(x, 2) == 0 end) false
Если функция не задана, по умолчанию проверяется, являются ли все элементы в итерируемом объекте истинными значениями.
iex> Enum.all?([1, 2, 3]) true iex> Enum.all?([1, nil, 3]) false
any?(enumerable, fun \\ fn x -> x end)
any?(t(), (element() -> as_boolean(term()))) :: boolean()
Возвращает true, если заданное fun вычисляет true для любого из элементов в итерируемом объекте.
Останавливает итерацию при первом вызове, который возвращает истинное значение (не false или nil).
Примеры
iex> Enum.any?([2, 4, 6], fn(x) -> rem(x, 2) == 1 end) false iex> Enum.any?([2, 3, 4], fn(x) -> rem(x, 2) == 1 end) true
Если функция не задана, по умолчанию проверяется, является ли хотя бы один элемент в итерируемом объекте истинным значением.
iex> Enum.any?([false, false, false]) false iex> Enum.any?([false, true, false]) true
at(enumerable, index, default \\ nil)
at(t(), index(), default()) :: element() | default()
Находит элемент по заданному index (нумерация с нуля).
Возвращает default если index выходит за пределы.
Можно передать отрицательное значение index, что означает, что итерируемый объект перебирается один раз, а enumerable подсчитывается с конца (например, -1 находит последний элемент).
Обратите внимание, что эта операция занимает линейное время. Для доступа к элементу с индексом index, потребуется пройти по index предыдущим элементам.
Примеры
iex> Enum.at([2, 4, 6], 0) 2 iex> Enum.at([2, 4, 6], 2) 6 iex> Enum.at([2, 4, 6], 4) nil iex> Enum.at([2, 4, 6], 4, :none) :none
chunk(enumerable, count)
chunk(t(), pos_integer()) :: [list()]
Является сокращением для chunk(enumerable, count, count)
chunk(enumerable, count, step, leftover \\ nil)
chunk(t(), pos_integer(), pos_integer(), t() | nil) :: [list()]
Возвращает список списков, содержащих по count элементов каждый, где каждый новый фрагмент начинается через step элементов в итерируемом объекте.
step необязательный аргумент и по умолчанию равен count, т. е. фрагменты не перекрываются.
Если последний фрагмент не содержит count элементов для заполнения фрагмента, элементы берутся из leftover если он был передан.
Если leftover передан и не содержит достаточного количества элементов для заполнения фрагмента, то возвращается частичный фрагмент с менее чем count элементами. Если leftover вообще не передан или равен nil, то частичный фрагмент отбрасывается из результата.
Если count больше, чем количество элементов в итерируемом объекте, и leftover не передан, будет возвращён пустой список.
Примеры
iex> Enum.chunk([1, 2, 3, 4, 5, 6], 2) [[1, 2], [3, 4], [5, 6]] iex> Enum.chunk([1, 2, 3, 4, 5, 6], 3, 2) [[1, 2, 3], [3, 4, 5]] iex> Enum.chunk([1, 2, 3, 4, 5, 6], 3, 2, [7]) [[1, 2, 3], [3, 4, 5], [5, 6, 7]] iex> Enum.chunk([1, 2, 3, 4], 3, 3, []) [[1, 2, 3], [4]] iex> Enum.chunk([1, 2, 3, 4], 10) [] iex> Enum.chunk([1, 2, 3, 4], 10, 10, []) [[1, 2, 3, 4]]
chunk_by(enumerable, fun)
chunk_by(t(), (element() -> any())) :: [list()]
Разделяет итерируемый объект на каждый элемент, для которого fun возвращает новое значение.
Возвращает список списков.
Примеры
iex> Enum.chunk_by([1, 2, 2, 3, 4, 4, 6, 7, 7], &(rem(&1, 2) == 1)) [[1], [2, 2], [3], [4, 4, 6], [7, 7]]
concat(enumerables)
concat(t()) :: t()
Принимая итерируемый объект итерируемых объектов, объединяет итерируемые объекты в один список.
Примеры
iex> Enum.concat([1..3, 4..6, 7..9]) [1, 2, 3, 4, 5, 6, 7, 8, 9] iex> Enum.concat([[1, [2], 3], [4], [5, 6]]) [1, [2], 3, 4, 5, 6]
concat(left, right)
concat(t(), t()) :: t()
Объединяет итерируемый объект справа с итерируемым объектом слева.
Эта функция производит тот же результат, что и оператор Kernel.++/2 для списков.
Примеры
iex> Enum.concat(1..3, 4..6) [1, 2, 3, 4, 5, 6] iex> Enum.concat([1, 2, 3], [4, 5, 6]) [1, 2, 3, 4, 5, 6]
count(enumerable)
count(t()) :: non_neg_integer()
Возвращает размер итерируемого объекта.
Примеры
iex> Enum.count([1, 2, 3]) 3
count(enumerable, fun)
count(t(), (element() -> as_boolean(term()))) :: non_neg_integer()
Возвращает количество элементов в итерируемом объекте, для которых fun возвращает истинное значение.
Примеры
iex> Enum.count([1, 2, 3, 4, 5], fn(x) -> rem(x, 2) == 0 end) 2
dedup(enumerable)
dedup(t()) :: list()
Итерирует enumerable, возвращая список, где все последовательные повторяющиеся элементы сводятся к одному элементу.
Элементы сравниваются с использованием ===.
Если вы хотите удалить все повторяющиеся элементы, независимо от порядка, см. uniq/1.
Примеры
iex> Enum.dedup([1, 2, 3, 3, 2, 1]) [1, 2, 3, 2, 1] iex> Enum.dedup([1, 1, 2, 2.0, :three, :"three"]) [1, 2, 2.0, :three]
dedup_by(enumerable, fun)
dedup_by(t(), (element() -> term())) :: list()
Перечисляет enumerable, возвращая список, где все последовательные дублированные элементы сводятся к одному элементу.
Функция fun отображает каждый элемент на термин, который используется для определения, являются ли два элемента дубликатами.
Примеры
iex> Enum.dedup_by([{1, :a}, {2, :b}, {2, :c}, {1, :a}], fn {x, _} -> x end)
[{1, :a}, {2, :b}, {1, :a}]
iex> Enum.dedup_by([5, 1, 2, 3, 2, 1], fn x -> x > 2 end)
[5, 1, 3, 2] drop(enumerable, amount)
drop(t(), integer()) :: list()
Удаляет amount элементов из перечисляемого объекта.
Если задано отрицательное amount, будут удалены amount последних значений.
Перечисляемый объект enumerable перебирается один раз, чтобы получить правильный индекс, а оставшиеся вычисления выполняются с конца.
Примеры
iex> Enum.drop([1, 2, 3], 2) [3] iex> Enum.drop([1, 2, 3], 10) [] iex> Enum.drop([1, 2, 3], 0) [1, 2, 3] iex> Enum.drop([1, 2, 3], -1) [1, 2]
drop_every(enumerable, nth)
drop_every(t(), non_neg_integer()) :: list()
Возвращает список, в котором каждый nth элемент перечисляемого объекта удалён, начиная с первого элемента.
Первый элемент всегда удаляется, если nth не равно 0.
Второй аргумент, определяющий каждый nth элемент, должен быть неотрицательным целым числом.
Примеры
iex> Enum.drop_every(1..10, 2) [2, 4, 6, 8, 10] iex> Enum.drop_every(1..10, 0) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] iex> Enum.drop_every([1, 2, 3], 1) []
drop_while(enumerable, fun)
drop_while(t(), (element() -> as_boolean(term()))) :: list()
Удаляет элементы в начале перечисляемого объекта, пока fun возвращает истинное значение.
Примеры
iex> Enum.drop_while([1, 2, 3, 2, 1], fn(x) -> x < 3 end) [3, 2, 1]
each(enumerable, fun)
each(t(), (element() -> any())) :: :ok
Вызывает заданную fun для каждого элемента в перечисляемом объекте.
Возвращает :ok.
Примеры
Enum.each(["some", "example"], fn(x) -> IO.puts x end) "some" "example" #=> :ok
empty?(enumerable)
empty?(t()) :: boolean()
Определяет, пуст ли перечисляемый объект.
Возвращает true , если enumerable пуст, в противном случае false.
Примеры
iex> Enum.empty?([]) true iex> Enum.empty?([1, 2, 3]) false
fetch(enumerable, index)
fetch(t(), index()) :: {:ok, element()} | :error Находит элемент по заданному index (нумерация с нуля).
Возвращает {:ok, element} , если найден, в противном случае :error.
Можно передать отрицательное index, что означает, что enumerable перебирается один раз, а index подсчитывается с конца (например, -1 извлекает последний элемент).
Обратите внимание, что эта операция занимает линейное время. Для доступа к элементу с индексом index, необходимо пройти index предыдущих элементов.
Примеры
iex> Enum.fetch([2, 4, 6], 0)
{:ok, 2}
iex> Enum.fetch([2, 4, 6], -3)
{:ok, 2}
iex> Enum.fetch([2, 4, 6], 2)
{:ok, 6}
iex> Enum.fetch([2, 4, 6], 4)
:error fetch!(enumerable, index)
fetch!(t(), index()) :: element() | no_return()
Находит элемент по заданному index (нумерация с нуля).
Вызывает исключение OutOfBoundsError , если заданный index находится вне диапазона перечисляемого объекта.
Обратите внимание, что эта операция занимает линейное время. Для доступа к элементу с индексом index, необходимо пройти index предыдущих элементов.
Примеры
iex> Enum.fetch!([2, 4, 6], 0) 2 iex> Enum.fetch!([2, 4, 6], 2) 6 iex> Enum.fetch!([2, 4, 6], 4) ** (Enum.OutOfBoundsError) out of bounds error
filter(enumerable, fun)
filter(t(), (element() -> as_boolean(term()))) :: list()
Фильтрует перечисляемый объект, т.е. возвращает только те элементы, для которых fun возвращает истинное значение.
См. также reject/2.
Примеры
iex> Enum.filter([1, 2, 3], fn(x) -> rem(x, 2) == 0 end) [2]
filter_map(enumerable, filter, mapper)
filter_map(t(), (element() -> as_boolean(term())), (element() -> element())) :: list()
Фильтрует перечисляемый объект и отображает его элементы за один проход.
Примеры
iex> Enum.filter_map([1, 2, 3], fn(x) -> rem(x, 2) == 0 end, &(&1 * 2)) [4]
find(enumerable, default \\ nil, fun)
find(t(), default(), (element() -> any())) :: element() | default()
Возвращает первый элемент, для которого fun возвращает истинное значение. Если такой элемент не найден, возвращает default.
Примеры
iex> Enum.find([2, 4, 6], fn(x) -> rem(x, 2) == 1 end) nil iex> Enum.find([2, 4, 6], 0, fn(x) -> rem(x, 2) == 1 end) 0 iex> Enum.find([2, 3, 4], fn(x) -> rem(x, 2) == 1 end) 3
find_index(enumerable, fun)
find_index(t(), (element() -> any())) :: non_neg_integer() | nil
Аналогично find/3, но возвращает индекс (нумерация с нуля) элемента вместо самого элемента.
Примеры
iex> Enum.find_index([2, 4, 6], fn(x) -> rem(x, 2) == 1 end) nil iex> Enum.find_index([2, 3, 4], fn(x) -> rem(x, 2) == 1 end) 1
find_value(enumerable, default \\ nil, fun)
find_value(t(), any(), (element() -> any())) :: any() | nil
Аналогично find/3, но возвращает значение вызова функции вместо самого элемента.
Примеры
iex> Enum.find_value([2, 4, 6], fn(x) -> rem(x, 2) == 1 end) nil iex> Enum.find_value([2, 3, 4], fn(x) -> rem(x, 2) == 1 end) true iex> Enum.find_value([1, 2, 3], "no bools!", &is_boolean/1) "no bools!"
flat_map(enumerable, fun)
flat_map(t(), (element() -> t())) :: list()
Возвращает новый перечисляемый объект, добавляя результат вызова fun для каждого соответствующего элемента enumerable.
Заданная функция должна возвращать перечисляемый объект.
Примеры
iex> Enum.flat_map([:a, :b, :c], fn(x) -> [x, x] end)
[:a, :a, :b, :b, :c, :c]
iex> Enum.flat_map([{1, 3}, {4, 6}], fn({x, y}) -> x..y end)
[1, 2, 3, 4, 5, 6]
iex> Enum.flat_map([:a, :b, :c], fn(x) -> [[x]] end)
[[:a], [:b], [:c]] flat_map_reduce(enumerable, acc, fun)
flat_map_reduce(t(), acc, fun) :: {[any()], any()} when fun: (element(), acc -> {t(), acc} | {:halt, acc}), acc: any() Отображает и сводит перечисляемый объект, уплощая полученные результаты (только один уровень вглубь).
Ожидает накопитель и функцию, которая получает каждый элемент перечисляемого объекта и должна возвращать кортеж, содержащий новый перечисляемый объект (часто список) с новым накопителем или кортеж с :halt в качестве первого элемента и накопителем во втором.
Примеры
iex> enum = 1..100
iex> n = 3
iex> Enum.flat_map_reduce(enum, 0, fn i, acc ->
...> if acc < n, do: {[i], acc + 1}, else: {:halt, acc}
...> end)
{[1, 2, 3], 3}
iex> Enum.flat_map_reduce(1..5, 0, fn(i, acc) -> {[[i]], acc + i} end)
{[[1], [2], [3], [4], [5]], 15} group_by(enumerable, key_fun, value_fun \\ fn x -> x end)
group_by(t(), (element() -> any()), (element() -> any())) :: map()
Разбивает перечисляемый объект на группы на основе key_fun.
Результат — карта, где каждый ключ задаётся функцией key_fun, а каждое значение — список элементов, заданных функцией value_fun. Порядок сохраняется.
Примеры
iex> Enum.group_by(~w{ant buffalo cat dingo}, &String.length/1)
%{3 => ["ant", "cat"], 7 => ["buffalo"], 5 => ["dingo"]}
iex> Enum.group_by(~w{ant buffalo cat dingo}, &String.length/1, &String.first/1)
%{3 => ["a", "c"], 7 => ["b"], 5 => ["d"]} intersperse(enumerable, element)
intersperse(t(), element()) :: list()
Вставляет element между каждым элементом перечисления.
Сложность: O(n).
Примеры
iex> Enum.intersperse([1, 2, 3], 0) [1, 0, 2, 0, 3] iex> Enum.intersperse([1], 0) [1] iex> Enum.intersperse([], 0) []
into(enumerable, collectable)
into(Enumerable.t(), Collectable.t()) :: Collectable.t()
Вставляет заданный enumerable в collectable.
Примеры
iex> Enum.into([1, 2], [0])
[0, 1, 2]
iex> Enum.into([a: 1, b: 2], %{})
%{a: 1, b: 2}
iex> Enum.into(%{a: 1}, %{b: 2})
%{a: 1, b: 2}
iex> Enum.into([a: 1, a: 2], %{})
%{a: 2} into(enumerable, collectable, transform)
into(Enumerable.t(), Collectable.t(), (term() -> term())) :: Collectable.t()
Вставляет заданный enumerable в collectable в соответствии с функцией преобразования.
Примеры
iex> Enum.into([2, 3], [3], fn x -> x * 3 end) [3, 6, 9]
join(enumerable, joiner \\ "")
join(t(), String.t()) :: String.t()
Объединяет перечисляемый объект в двоичное значение, используя joiner в качестве разделителя.
Если joiner не указан, по умолчанию используется пустое двоичное значение.
Все элементы в перечисляемом объекте должны быть преобразуемы в двоичное значение, в противном случае возникает ошибка.
Примеры
iex> Enum.join([1, 2, 3]) "123" iex> Enum.join([1, 2, 3], " = ") "1 = 2 = 3"
map(enumerable, fun)
map(t(), (element() -> any())) :: list()
Возвращает список, где каждый элемент — результат вызова fun для каждого соответствующего элемента enumerable.
Для карт функция ожидает кортеж ключ-значение.
Примеры
iex> Enum.map([1, 2, 3], fn(x) -> x * 2 end)
[2, 4, 6]
iex> Enum.map([a: 1, b: 2], fn({k, v}) -> {k, -v} end)
[a: -1, b: -2] map_every(enumerable, nth, fun)
map_every(t(), non_neg_integer(), (element() -> any())) :: list()
Возвращает список результатов вызова fun для каждого nth элемента enumerable, начиная с первого элемента.
Первый элемент всегда передаётся в заданную функцию.
Второй аргумент, определяющий каждый nth элемент, должен быть неотрицательным целым числом.
Примеры
iex> Enum.map_every(1..10, 2, fn(x) -> x * 2 end) [2, 2, 6, 4, 10, 6, 14, 8, 18, 10] iex> Enum.map_every(1..5, 0, fn(x) -> x * 2 end) [1, 2, 3, 4, 5] iex> Enum.map_every([1, 2, 3], 1, fn(x) -> x * 2 end) [2, 4, 6]
map_join(enumerable, joiner \\ "", mapper)
map_join(t(), String.t(), (element() -> any())) :: String.t()
Отображает и объединяет заданный перечисляемый объект за один проход.
joiner может быть либо двоичным значением, либо списком, и результат будет того же типа, что и joiner. Если joiner не задан, по умолчанию используется пустое двоичное значение.
Все элементы в перечисляемом объекте должны быть преобразуемы в двоичное значение, в противном случае возникает ошибка.
Примеры
iex> Enum.map_join([1, 2, 3], &(&1 * 2)) "246" iex> Enum.map_join([1, 2, 3], " = ", &(&1 * 2)) "2 = 4 = 6"
map_reduce(enumerable, acc, fun)
map_reduce(t(), any(), (element(), any() -> {any(), any()})) :: {any(), any()} Вызывает заданную функцию для каждого элемента в перечисляемом объекте для его сведения к одному элементу, сохраняя накопитель.
Возвращает кортеж, где первый элемент — отображённый перечисляемый объект, а второй — конечный накопитель.
Функция, fun, получает два аргумента: первый — элемент, а второй — накопитель. fun должна возвращать кортеж с двумя элементами в формате {result, accumulator}.
Для карт первый элемент кортежа должен быть кортежем {key, value}.
Примеры
iex> Enum.map_reduce([1, 2, 3], 0, fn(x, acc) -> {x * 2, x + acc} end)
{[2, 4, 6], 6} max(enumerable, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
max(t(), (() -> empty_result)) :: element() | empty_result | no_return() when empty_result: any()
Возвращает максимальный элемент в перечисляемом объекте в соответствии с порядком термов Erlang.
Если несколько элементов считаются максимальными, возвращается первый найденный.
Вызывает предоставленную empty_fallback функцию и возвращает её значение, если enumerable пусто. По умолчанию empty_fallback вызывает Enum.EmptyError.
Примеры
iex> Enum.max([1, 2, 3]) 3 iex> Enum.max([], fn -> 0 end) 0
max_by(enumerable, fun, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
max_by(t(), (element() -> any()), (() -> empty_result)) :: element() | empty_result | no_return() when empty_result: any()
Возвращает максимальный элемент в перечислимом объекте, рассчитанный с помощью заданной функции.
Если несколько элементов считаются максимальными, возвращается первый найденный.
Вызывает предоставленную empty_fallback функцию и возвращает её значение, если enumerable пусто. По умолчанию empty_fallback вызывает Enum.EmptyError.
Примеры
iex> Enum.max_by(["a", "aa", "aaa"], fn(x) -> String.length(x) end) "aaa" iex> Enum.max_by(["a", "aa", "aaa", "b", "bbb"], &String.length/1) "aaa" iex> Enum.max_by([], &String.length/1, fn -> nil end) nil
member?(enumerable, element)
member?(t(), element()) :: boolean()
Проверяет, существует ли element в перечислимом объекте.
Членство проверяется с помощью оператора совпадения (===) .
Примеры
iex> Enum.member?(1..10, 5) true iex> Enum.member?(1..10, 5.0) false iex> Enum.member?([1.0, 2.0, 3.0], 2) false iex> Enum.member?([1.0, 2.0, 3.0], 2.000) true iex> Enum.member?([:a, :b, :c], :d) false
min(enumerable, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
min(t(), (() -> empty_result)) :: element() | empty_result | no_return() when empty_result: any()
Возвращает минимальный элемент в перечислимом объекте в соответствии с порядком Erlang.
Если несколько элементов считаются минимальными, возвращается первый найденный.
Вызывает предоставленную empty_fallback функцию и возвращает её значение, если enumerable пусто. По умолчанию empty_fallback вызывает Enum.EmptyError.
Примеры
iex> Enum.min([1, 2, 3]) 1 iex> Enum.min([], fn -> 0 end) 0
min_by(enumerable, fun, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
min_by(t(), (element() -> any()), (() -> empty_result)) :: element() | empty_result | no_return() when empty_result: any()
Возвращает минимальный элемент в перечислимом объекте, рассчитанный с помощью заданной функции.
Если несколько элементов считаются минимальными, возвращается первый найденный.
Вызывает предоставленную empty_fallback функцию и возвращает её значение, если enumerable пусто. По умолчанию empty_fallback вызывает Enum.EmptyError.
Примеры
iex> Enum.min_by(["a", "aa", "aaa"], fn(x) -> String.length(x) end) "a" iex> Enum.min_by(["a", "aa", "aaa", "b", "bbb"], &String.length/1) "a" iex> Enum.min_by([], &String.length/1, fn -> nil end) nil
min_max(enumerable, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
min_max(t(), (() -> empty_result)) ::
{element(), element()} |
empty_result |
no_return() when empty_result: any() Возвращает кортеж с минимальным и максимальным элементами в перечислимом объекте в соответствии с порядком Erlang.
Если несколько элементов считаются максимальными или минимальными, возвращается первый найденный.
Вызывает предоставленную empty_fallback функцию и возвращает её значение, если enumerable пусто. По умолчанию empty_fallback вызывает Enum.EmptyError.
Примеры
iex> Enum.min_max([2, 3, 1])
{1, 3}
iex> Enum.min_max([], fn -> {nil, nil} end)
{nil, nil} min_max_by(enumerable, fun, empty_fallback \\ fn -> raise(Enum.EmptyError) end)
min_max_by(t(), (element() -> any()), (() -> empty_result)) ::
{element(), element()} |
empty_result |
no_return() when empty_result: any() Возвращает кортеж с минимальным и максимальным элементами в перечислимом объекте, рассчитанных с помощью заданной функции.
Если несколько элементов считаются максимальными или минимальными, возвращается первый найденный.
Вызывает предоставленную empty_fallback функцию и возвращает её значение, если enumerable пусто. По умолчанию empty_fallback вызывает Enum.EmptyError.
Примеры
iex> Enum.min_max_by(["aaa", "bb", "c"], fn(x) -> String.length(x) end)
{"c", "aaa"}
iex> Enum.min_max_by(["aaa", "a", "bb", "c", "ccc"], &String.length/1)
{"a", "aaa"}
iex> Enum.min_max_by([], &String.lenth/1, fn -> {nil, nil} end)
{nil, nil} random(enumerable)
random(t()) :: element() | no_return()
Возвращает случайный элемент перечислимого объекта.
Вызывает Enum.EmptyError, если enumerable пусто.
Эта функция использует модуль :rand Erlang для расчёта случайного значения. Обратитесь к документации, чтобы узнать о настройке другого алгоритма случайных чисел или другого начального значения.
Реализация основана на алгоритме выборки резервуара. Предполагается, что возвращаемый образец помещается в память; входной enumerable не обязательно должен, так как он просматривается только один раз.
Если в функцию передаётся диапазон, эта функция выберет случайное значение в пределах границ диапазона, не просматривая весь диапазон (тем самым выполняясь за постоянное время и постоянную память).
Примеры
# Although not necessary, let's seed the random algorithm
iex> :rand.seed(:exsplus, {101, 102, 103})
iex> Enum.random([1, 2, 3])
2
iex> Enum.random([1, 2, 3])
1
iex> Enum.random(1..1_000)
776 reduce(enumerable, fun)
reduce(t(), (element(), any() -> any())) :: any()
Вызывает fun для каждого элемента в enumerable, передавая этот элемент и накопитель в качестве аргументов. Значение возвращаемое fun хранится в накопителе.
Первый элемент перечислимого объекта используется в качестве начального значения накопителя. Если вы хотите использовать другое значение для накопителя, используйте Enumerable.reduce/3. Эта функция не вызовет указанную функцию для перечислимых объектов длиной один элемент.
Возвращает накопитель.
Обратите внимание, что так как первый элемент перечислимого объекта используется в качестве начального значения накопителя, fun будет выполняться n - 1 раз, где n - это длина перечислимого объекта.
Примеры
iex> Enum.reduce([1, 2, 3, 4], fn(x, acc) -> x * acc end) 24
reduce(enumerable, acc, fun)
reduce(t(), any(), (element(), any() -> any())) :: any()
Вызывает fun для каждого элемента в enumerable, передавая этот элемент и накопитель acc в качестве аргументов. Значение возвращаемое fun хранится в acc.
Возвращает накопитель.
Примеры
iex> Enum.reduce([1, 2, 3], 0, fn(x, acc) -> x + acc end) 6
reduce_while(enumerable, acc, fun)
reduce_while(t(), any(), (element(), any() -> {:cont, any()} | {:halt, any()})) :: any() Уменьшает перечислимый объект до тех пор, пока fun не вернёт {:halt, term}.
Возвращаемое значение для fun должно быть
-
{:cont, acc}продолжить уменьшение сaccв качестве нового накопителя или -
{:halt, acc}прервать уменьшение и вернутьaccв качестве возвращаемого значения этой функции
Примеры
iex> Enum.reduce_while(1..100, 0, fn i, acc ->
...> if i < 3, do: {:cont, acc + i}, else: {:halt, acc}
...> end)
3 reject(enumerable, fun)
reject(t(), (element() -> as_boolean(term()))) :: list()
Возвращает элементы enumerable, для которых функция fun возвращает false или nil.
См. также filter/2.
Примеры
iex> Enum.reject([1, 2, 3], fn(x) -> rem(x, 2) == 0 end) [1, 3]
reverse(enumerable)
reverse(t()) :: list()
Возвращает список элементов в enumerable в обратном порядке.
Примеры
iex> Enum.reverse([1, 2, 3]) [3, 2, 1]
reverse(enumerable, tail)
reverse(t(), t()) :: list()
Инвертирует элементы в enumerable, добавляет хвост и возвращает его в виде списка.
Это оптимизация для Enum.concat(Enum.reverse(enumerable), tail).
Примеры
iex> Enum.reverse([1, 2, 3], [4, 5, 6]) [3, 2, 1, 4, 5, 6]
reverse_slice(enumerable, start, count)
reverse_slice(t(), non_neg_integer(), non_neg_integer()) :: list()
Инвертирует перечислимый объект в диапазоне от начальной позиции start до count элементов.
Если count больше, чем размер остальной части перечислимого объекта, тогда эта функция инвертирует остальную часть перечислимого объекта.
Примеры
iex> Enum.reverse_slice([1, 2, 3, 4, 5, 6], 2, 4) [1, 2, 6, 5, 4, 3]
scan(enumerable, fun)
scan(t(), (element(), any() -> any())) :: list()
Применяет заданную функцию к каждому элементу в перечислимом объекте, сохраняя результат в списке и передавая его в качестве накопителя для следующего вычисления.
Примеры
iex> Enum.scan(1..5, &(&1 + &2)) [1, 3, 6, 10, 15]
scan(enumerable, acc, fun)
scan(t(), any(), (element(), any() -> any())) :: list()
Применяет заданную функцию к каждому элементу в перечислимом объекте, сохраняя результат в списке и передавая его в качестве накопителя для следующего вычисления. Использует заданное acc в качестве начального значения.
Примеры
iex> Enum.scan(1..5, 0, &(&1 + &2)) [1, 3, 6, 10, 15]
shuffle(enumerable)
shuffle(t()) :: list()
Возвращает список со случайным порядком элементов enumerable.
Эта функция использует модуль :rand Erlang для расчёта случайного значения. Обратитесь к документации, чтобы узнать о настройке другого алгоритма случайных чисел или другого начального значения.
Примеры
# Although not necessary, let's seed the random algorithm
iex> :rand.seed(:exsplus, {1, 2, 3})
iex> Enum.shuffle([1, 2, 3])
[2, 1, 3]
iex> Enum.shuffle([1, 2, 3])
[2, 3, 1] slice(enumerable, range)
slice(t(), Range.t()) :: list()
Возвращает подмножество списка из данного перечислимого объекта, от range.first до range.last позиций.
С учётом enumerable, он опускает элементы до позиции элемента range.first, затем берёт элементы до позиции элемента range.last (включительно).
Позиции нормализованы, то есть отрицательные позиции будут считаться с конца (например, -1 означает последний элемент перечислимого объекта). Если range.last выходит за пределы, ему присваивается позиция последнего элемента.
Если нормализованная range.first позиция выходит за пределы данного перечислимого объекта или эта позиция больше нормализованной range.last позиции, то возвращается [].
Примеры
iex> Enum.slice(1..100, 5..10) [6, 7, 8, 9, 10, 11] iex> Enum.slice(1..10, 5..20) [6, 7, 8, 9, 10] # last five elements (negative positions) iex> Enum.slice(1..30, -5..-1) [26, 27, 28, 29, 30] # last five elements (mixed positive and negative positions) iex> Enum.slice(1..30, 25..-1) [26, 27, 28, 29, 30] # out of bounds iex> Enum.slice(1..10, 11..20) [] # range.first is greater than range.last iex> Enum.slice(1..10, 6..5) []
slice(enumerable, start, amount)
slice(t(), index(), non_neg_integer()) :: list()
Возвращает подмножество списка заданного перечисляемого объекта, начиная с позиции start с amount элементами, если они доступны.
Учитывая enumerable, он пропускает элементы до позиции элемента start, затем берет amount элементов до конца перечисляемого объекта.
Если start выходит за пределы допустимых значений, возвращает [].
Если amount больше, чем длина enumerable, возвращает как можно больше элементов. Если amount равно нулю, то возвращается [].
Примеры
iex> Enum.slice(1..100, 5, 10) [6, 7, 8, 9, 10, 11, 12, 13, 14, 15] # amount to take is greater than the number of elements iex> Enum.slice(1..10, 5, 100) [6, 7, 8, 9, 10] iex> Enum.slice(1..10, 5, 0) [] # out of bound start position iex> Enum.slice(1..10, 10, 5) [] # out of bound start position (negative) iex> Enum.slice(1..10, -11, 5) []
sort(enumerable)
sort(t()) :: list()
Сортирует перечисляемый объект в соответствии с порядком терминов Erlang.
Использует алгоритм слияния.
Примеры
iex> Enum.sort([3, 2, 1]) [1, 2, 3]
sort(enumerable, fun)
sort(t(), (element(), element() -> boolean())) :: list()
Сортирует перечисляемый объект с помощью заданной функции.
Эта функция использует алгоритм слияния. Заданная функция должна сравнивать два аргумента и возвращать true, если первый аргумент предшествует второму.
Примеры
iex> Enum.sort([1, 2, 3], &(&1 >= &2)) [3, 2, 1]
Алгоритм сортировки будет стабильным, если заданная функция возвращает true для значений, считаемых равными:
iex> Enum.sort ["some", "kind", "of", "monster"], &(byte_size(&1) <= byte_size(&2)) ["of", "some", "kind", "monster"]
Если функция не возвращает true для равных значений, сортировка нестабильна, и порядок равных терминов может быть перемешан. Например:
iex> Enum.sort ["some", "kind", "of", "monster"], &(byte_size(&1) < byte_size(&2)) ["of", "kind", "some", "monster"]
sort_by(enumerable, mapper, sorter \\ &<=/2)
sort_by(t(), (element() -> mapped_element), (mapped_element, mapped_element -> boolean())) :: list() when mapped_element: element()
Сортирует отображенные результаты перечисляемого объекта в соответствии с предоставленной sorter функцией.
Эта функция отображает каждый элемент перечисляемого объекта с помощью предоставленной mapper функции. Затем перечисляемый объект сортируется по отображенным элементам с помощью sorter функции, по умолчанию Kernel.<=/2
sort_by/3 отличается от sort/2 тем, что вычисляет значение сравнения для каждого элемента перечисляемого объекта только один раз, вместо одного раза для каждого элемента в каждом сравнении. Если одна и та же функция вызывается для обоих элементов, использование sort_by/3 также более компактно.
Этот метод также известен как преобразование Шварца, или как идиома «декорация-сортировка-декорирование» в Lisp, так как mapper декорирует исходный enumerable; затем sorter сортирует декорации; и, наконец, перечисляемый объект раскодируется, так что остаются только исходные элементы, но теперь в отсортированном порядке.
Примеры
Использование по умолчанию sorter <=/2:
iex> Enum.sort_by ["some", "kind", "of", "monster"], &byte_size/1 ["of", "some", "kind", "monster"]
Использование пользовательской sorter для переопределения порядка:
iex> Enum.sort_by ["some", "kind", "of", "monster"], &byte_size/1, &>=/2 ["monster", "some", "kind", "of"]
split(enumerable, count)
split(t(), integer()) :: {list(), list()} Разделяет enumerable на два перечисляемых объекта, оставляя count элементов в первом.
Если count является отрицательным числом, оно начинает отсчёт с конца перечисляемого объекта.
Обратите внимание, что отрицательное count подразумевает, что enumerable будет перебираться дважды: один раз для расчета позиции и второй раз для фактического разделения.
Примеры
iex> Enum.split([1, 2, 3], 2)
{[1, 2], [3]}
iex> Enum.split([1, 2, 3], 10)
{[1, 2, 3], []}
iex> Enum.split([1, 2, 3], 0)
{[], [1, 2, 3]}
iex> Enum.split([1, 2, 3], -1)
{[1, 2], [3]}
iex> Enum.split([1, 2, 3], -5)
{[], [1, 2, 3]} split_while(enumerable, fun)
split_while(t(), (element() -> as_boolean(term()))) :: {list(), list()} Разделяет перечисляемый объект на две части в позиции элемента, для которого fun возвращает false в первый раз.
Примеры
iex> Enum.split_while([1, 2, 3, 4], fn(x) -> x < 3 end)
{[1, 2], [3, 4]} split_with(enumerable, fun)
split_with(t(), (element() -> any())) :: {list(), list()} Разделяет enumerable на два списка в соответствии с заданной функцией fun.
Разделяет данный enumerable на два списка, вызывая fun с каждым элементом в enumerable в качестве единственного аргумента. Возвращает кортеж с первым списком, содержащим все элементы в enumerable , для которых применение fun вернуло истинное значение, и второй список со всеми элементами, для которых применение fun вернуло ложное значение (false или nil).
Элементы в обоих возвращаемых списках находятся в том же относительном порядке, что и в исходном перечисляемом объекте (если такой перечисляемый объект был упорядочен, например, список); см. примеры ниже.
Примеры
iex> Enum.split_with([5, 4, 3, 2, 1, 0], fn(x) -> rem(x, 2) == 0 end)
{[4, 2, 0], [5, 3, 1]}
iex> Enum.split_with(%{a: 1, b: -2, c: 1, d: -3}, fn({_k, v}) -> v < 0 end)
{[b: -2, d: -3], [a: 1, c: 1]}
iex> Enum.split_with(%{a: 1, b: -2, c: 1, d: -3}, fn({_k, v}) -> v > 50 end)
{[], [a: 1, b: -2, c: 1, d: -3]}
iex> Enum.split_with(%{}, fn({_k, v}) -> v > 50 end)
{[], []} sum(enumerable)
sum(t()) :: number()
Возвращает сумму всех элементов.
Возбуждает исключение ArithmeticError, если enumerable содержит нечисловое значение.
Примеры
iex> Enum.sum([1, 2, 3]) 6
take(enumerable, count)
take(t(), integer()) :: list()
Возвращает первые count элементов перечисляемого объекта.
count должно быть целым числом. Если задан отрицательный count, будут взяты последние count значения. В таком случае перечисляемый объект полностью перебирается, сохраняя до 2 * count элементов в памяти. После достижения конца перечисляемого объекта возвращаются последние count элементов.
Примеры
iex> Enum.take([1, 2, 3], 2) [1, 2] iex> Enum.take([1, 2, 3], 10) [1, 2, 3] iex> Enum.take([1, 2, 3], 0) [] iex> Enum.take([1, 2, 3], -1) [3]
take_every(enumerable, nth)
take_every(t(), non_neg_integer()) :: list()
Возвращает список каждого nth элемента перечисляемого объекта, начиная с первого элемента.
Первый элемент всегда включается, если nth не 0.
Второй аргумент, указывающий каждый nth элемент, должен быть неотрицательным целым числом.
Примеры
iex> Enum.take_every(1..10, 2) [1, 3, 5, 7, 9] iex> Enum.take_every(1..10, 0) [] iex> Enum.take_every([1, 2, 3], 1) [1, 2, 3]
take_random(enumerable, count)
take_random(t(), non_neg_integer()) :: list()
Возвращает count случайных элементов из enumerable.
Обратите внимание, что эта функция переберёт весь enumerable для получения случайного подсписка.
См. random/1 для заметок по реализации и начальному значению генератора случайных чисел.
Примеры
# Although not necessary, let's seed the random algorithm
iex> :rand.seed(:exsplus, {1, 2, 3})
iex> Enum.take_random(1..10, 2)
[5, 4]
iex> Enum.take_random(?a..?z, 5)
'ipybz' take_while(enumerable, fun)
take_while(t(), (element() -> as_boolean(term()))) :: list()
Возвращает элементы с начала перечисляемого объекта, пока fun возвращает истинное значение.
Примеры
iex> Enum.take_while([1, 2, 3], fn(x) -> x < 3 end) [1, 2]
to_list(enumerable)
to_list(t()) :: [element()]
Преобразует enumerable в список.
Примеры
iex> Enum.to_list(1..3) [1, 2, 3]
uniq(enumerable)
uniq(t()) :: list()
Перебирает enumerable, удаляя все дублирующие элементы.
Примеры
iex> Enum.uniq([1, 2, 3, 3, 2, 1]) [1, 2, 3]
uniq_by(enumerable, fun)
uniq_by(t(), (element() -> term())) :: list()
Перебирает enumerable, удаляя элементы, для которых функция fun возвращает дублирующие элементы.
Функция fun отображает каждый элемент на терм, который используется для определения дублирующих элементов.
Сохраняется первое вхождение каждого элемента.
Пример
iex> Enum.uniq_by([{1, :x}, {2, :y}, {1, :z}], fn {x, _} -> x end)
[{1, :x}, {2, :y}]
iex> Enum.uniq_by([a: {:tea, 2}, b: {:tea, 2}, c: {:coffee, 1}], fn {_, y} -> y end)
[a: {:tea, 2}, c: {:coffee, 1}] unzip(enumerable)
unzip(t()) :: {[element()], [element()]} Обратное Enum.zip/2; извлекает кортежи из двух элементов из перечисляемого объекта и группирует их вместе.
Принимает перечисляемый объект с элементами, являющимися кортежами из двух элементов, и возвращает кортеж с двумя списками, каждый из которых формируется из первого и второго элемента каждого кортежа соответственно.
Эта функция терпит неудачу, если enumerable является или может быть преобразован в список кортежей с точно двумя элементами в каждом кортеже.
Примеры
iex> Enum.unzip([{:a, 1}, {:b, 2}, {:c, 3}])
{[:a, :b, :c], [1, 2, 3]}
iex> Enum.unzip(%{a: 1, b: 2})
{[:a, :b], [1, 2]} with_index(enumerable, offset \\ 0)
with_index(t(), integer()) :: [{element(), index()}] Возвращает перечисляемый объект с каждым элементом, заключённым в кортеж вместе с его индексом.
Если задан offset, индексация будет начинаться с заданного смещения, а не с нуля.
Примеры
iex> Enum.with_index([:a, :b, :c]) [a: 0, b: 1, c: 2] iex> Enum.with_index([:a, :b, :c], 3) [a: 3, b: 4, c: 5]
zip(enumerables)
zip([t()]) :: t()
Комбинирует соответствующие элементы из набора перечисляемых объектов в один список кортежей.
Комбинирование завершается, как только какой-либо перечисляемый объект завершается.
Примеры
iex> Enum.zip([[1, 2, 3], [:a, :b, :c], ["foo", "bar", "baz"]])
[{1, :a, "foo"}, {2, :b, "bar"}, {3, :c, "baz"}]
iex> Enum.zip([[1, 2, 3, 4, 5], [:a, :b, :c]])
[{1, :a}, {2, :b}, {3, :c}] zip(enumerable1, enumerable2)
zip(t(), t()) :: [{any(), any()}] Комбинирует соответствующие элементы из двух перечисляемых объектов в один список кортежей.
Комбинирование завершается, как только какой-либо перечисляемый объект завершается.
Примеры
iex> Enum.zip([1, 2, 3], [:a, :b, :c])
[{1, :a}, {2, :b}, {3, :c}]
iex> Enum.zip([1, 2, 3, 4, 5], [:a, :b, :c])
[{1, :a}, {2, :b}, {3, :c}]
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.4.5/Enum.html