defmodule AbsintheUtils.Helpers.Sort do
def sort_alike(
unsorted_enumerable,
sorted_enumerable,
unsorted_enumerable_mapper \\ & &1,
sorted_enumerable_mapper \\ & &1
) do
value_to_index =
sorted_enumerable
|> Enum.map(sorted_enumerable_mapper)
|> map_enum_to_index()
unsorted_enumerable
|> Enum.sort_by(fn element ->
Map.fetch!(
value_to_index,
unsorted_enumerable_mapper.(element)
)
end)
end
@doc """
Given an enumerable, returns a map of each element
to the position in the original enumerable (zero based).
## Examples
iex> Sort.map_enum_to_index([:a, :b, :c])
%{a: 0, b: 1, c: 2}
"""
@spec map_enum_to_index(list(any)) :: map
def map_enum_to_index(enumerable) do
enumerable
|> Enum.with_index()
|> Map.new(fn {element, index} -> {element, index} end)
end
end