defmodule Mune do @moduledoc """ A collection of useful functions that aren't found in `Enum`, but are cumbersome or inconvenient to write your own optimized version of. """ @type enum :: Enum.t() @doc """ Reverse the enum, applying `mapper` to each element iex> Mune.map_reverse([1, 2, 3, 4, 5, 6], &Kernel.*(&1, 2)) [12, 10, 8, 6, 4, 2] """ @spec map_reverse(enum, (term -> var)) :: list(var) when var: term def map_reverse(enum, mapper) do Enum.reduce(enum, [], fn i, acc -> [mapper.(i) | acc] end) end @doc """ Flatten the enum and reverse all elements, applying `mapper` to each element. iex> Mune.flat_map_reverse([[1, 2], [3, 4], [5, 6]], &Kernel.*(&1, 2)) [12, 10, 8, 6, 4, 2] """ @spec flat_map_reverse(enum, (term -> var)) :: list(var) when var: term def flat_map_reverse(enum, mapper) do Enum.reduce(enum, [], fn inner, acc -> Enum.reduce(inner, acc, fn i, acc -> [mapper.(i) | acc] end) end) end @doc """ Flatten the enum and reverse all elements. iex> Mune.flatten_reverse([[1, 2], [3, 4], [5, 6]]) [6, 5, 4, 3, 2, 1] """ @spec flatten_reverse(enum) :: list def flatten_reverse(enum) do Enum.reduce(enum, [], fn inner, acc -> Enum.reduce(inner, acc, fn i, acc -> [i | acc] end) end) end end