defmodule AbsintheUtils.Helpers.Sorting do @moduledoc """ Generic sorting utils. """ @doc """ Sorts an `unsorted_enumerable` based on `sorted_enumerable`. Use mappers to specify getters for each element in the enumerable, for example retrieving the id of a struct. ## Examples iex> Sorting.sort_alike([:b, :c, :a], [:a, :b, :c]) [:a, :b, :c] iex> Sorting.sort_alike([%{id: 1}, %{id: 2}], [2, 1], & &1.id) [%{id: 2}, %{id: 1}] """ def sort_alike( unsorted_enumerable, sorted_enumerable, unsorted_enumerable_mapper \\ & &1, sorted_enumerable_mapper \\ & &1 ) do id_to_unsorted_element = unsorted_enumerable |> Map.new(fn element -> { unsorted_enumerable_mapper.(element), element } end) Enum.map( sorted_enumerable, fn element -> Map.get( id_to_unsorted_element, sorted_enumerable_mapper.(element) ) end ) end end