lib/pardall_markdown/content/filters.ex

defmodule PardallMarkdown.Content.Filters do
  def filter_by_is_published(posts), do: posts |> Enum.filter(& &1.is_published)

  def sort_by_published_date(posts, sorter \\ {:desc, DateTime}),
    do: posts |> Enum.sort_by(& &1.date, sorter)

  def sort_by_title(posts), do: posts |> Enum.sort_by(& &1.title)
  def sort_by_slug(items), do: items |> Enum.sort_by(& &1.slug)

  def sort_by_custom(items, key, order \\ :asc)
  def sort_by_custom(items, :date, :asc), do: sort_by_published_date(items, {:asc, DateTime})
  def sort_by_custom(items, :date, :desc), do: sort_by_published_date(items)
  def sort_by_custom(items, key, :asc), do: items |> Enum.sort_by(&Map.get(&1, key))
  def sort_by_custom(items, key, :desc), do: items |> Enum.sort_by(&Map.get(&1, key), &>=/2)

  def sort_by_map_key(%{} = items), do: items |> Enum.sort_by(fn {key, _} -> key end)

  def sort_level_one_taxonomies_by_name(taxonomies) do
    taxonomies
    |> Enum.sort_by(
      fn %{level: level, title: title} -> {level, title} end,
      fn
        {1, title}, {1, previous_title} ->
          title <= previous_title

        el1, el2 ->
          el1 <= el2
      end
    )
  end
end