Current section

Files

Jump to
aja lib helpers enum_helper.ex
Raw

lib/helpers/enum_helper.ex

defmodule A.EnumHelper do
@moduledoc false
import A.OrdMap, only: [is_dense: 1]
alias A.Vector.Raw, as: RawVector
@dialyzer :no_opaque
@compile {:inline, try_get_raw_vec_or_list: 1}
def try_get_raw_vec_or_list(%A.Vector{__vector__: vector}), do: vector
def try_get_raw_vec_or_list(list) when is_list(list), do: list
def try_get_raw_vec_or_list(%A.OrdMap{__ord_vector__: vector} = ord_map) when is_dense(ord_map),
do: vector
def try_get_raw_vec_or_list(%A.OrdMap{__ord_vector__: vector}) do
RawVector.sparse_to_list(vector)
end
def try_get_raw_vec_or_list(%MapSet{} = map_set) do
MapSet.to_list(map_set)
end
def try_get_raw_vec_or_list(_) do
nil
end
@compile {:inline, to_raw_vec_or_list: 1}
def to_raw_vec_or_list(enumerable) do
case try_get_raw_vec_or_list(enumerable) do
nil -> Enum.to_list(enumerable)
vec_or_list -> vec_or_list
end
end
@compile {:inline, to_vec_or_list: 1}
def to_vec_or_list(enumerable) do
case try_get_raw_vec_or_list(enumerable) do
nil -> Enum.to_list(enumerable)
list when is_list(list) -> list
vector when is_tuple(vector) -> %A.Vector{__vector__: vector}
end
end
@compile {:inline, to_list: 1}
def to_list(enumerable) do
case try_get_raw_vec_or_list(enumerable) do
nil -> Enum.to_list(enumerable)
list when is_list(list) -> list
vector -> RawVector.to_list(vector)
end
end
@compile {:inline, map: 2}
def map(enumerable, fun) when is_function(fun, 1) do
case enumerable do
%A.Vector{__vector__: vector} ->
RawVector.map_to_list(vector, fun)
%A.OrdMap{__ord_vector__: vector} = ord_map when is_dense(ord_map) ->
RawVector.map_to_list(vector, fun)
%A.OrdMap{__ord_vector__: vector} = ord_map when is_dense(ord_map) ->
A.Vector.Raw.foldl(vector, [], fn
nil, acc -> acc
key_value, acc -> [fun.(key_value) | acc]
end)
|> :lists.reverse()
%MapSet{} = map_set ->
map_set |> MapSet.to_list() |> Enum.map(fun)
_ ->
Enum.map(enumerable, fun)
end
end
end