Коллектируемый протокол
Протокол для обхода структур данных.
Функция Enum.into/2 использует этот протокол для вставки перечисляемого объекта в коллекцию:
iex> Enum.into([a: 1, b: 2], %{})
%{a: 1, b: 2} Почему Коллектируемый?
Протокол Enumerable полезен для извлечения значений из коллекции. Чтобы поддерживать широкий спектр значений, функции, предоставляемые протоколом Enumerable, не сохраняют структуру. Например, передача карты в Enum.map/2 всегда возвращает список.
Такой дизайн является умышленным. Протокол Enumerable был разработан для поддержки бесконечных коллекций, ресурсов и других структур с фиксированной формой. Например, не имеет смысла вставлять значения в диапазон, так как он имеет фиксированную форму, где хранятся только границы диапазона.
Модуль Collectable был разработан для заполнения пробела, оставленного протоколом Enumerable. into/1 можно рассматривать как противоположность Enumerable.reduce/3. Если Enumerable связан с извлечением значений, то Collectable.into/1 связан с сбором этих значений в структуру.
Резюме
Типы
- command()
- t()
Функции
- into(collectable)
-
Возвращает функцию, которая собирает значения вместе с начальным значением накопления
Типы
command()
command() :: {:cont, term} | :done | :halt t()
t() :: term
Функции
into(collectable)
into(t) :: {term, (term, command -> t | term)} Возвращает функцию, которая собирает значения вместе с начальным значением накопления.
Возвращаемая функция получает коллектируемый объект и вставляет заданное значение в него для каждой {:cont, term} инструкции.
:done передаётся, когда больше значений вставлять не будет, полезно для закрытия ресурсов и нормализации значений. Коллектируемый объект должен быть возвращён в :done.
Если вставка внезапно прервана, :halt передаётся, и она может вернуть любое значение, так как оно не будет использовано.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.3.4/Collectable.html