29 lines
740 B
Elixir
29 lines
740 B
Elixir
defmodule Bones73kWeb.Pagination do
|
|
def generate_page_list(_, total_pages) when total_pages < 5,
|
|
do: 1..total_pages |> Enum.to_list()
|
|
|
|
def generate_page_list(current, total_pages),
|
|
do: first_half(1, current) ++ [current] ++ second_half(current, total_pages)
|
|
|
|
defp first_half(first, current) do
|
|
prev = current - 1
|
|
|
|
cond do
|
|
first == current -> []
|
|
prev <= first -> [first]
|
|
prev - first > 2 -> [first, -1, prev]
|
|
true -> first..prev |> Enum.to_list()
|
|
end
|
|
end
|
|
|
|
defp second_half(current, last) do
|
|
next = current + 1
|
|
|
|
cond do
|
|
last == current -> []
|
|
next >= last -> [last]
|
|
last - next > 2 -> [next, -1, last]
|
|
true -> next..last |> Enum.to_list()
|
|
end
|
|
end
|
|
end
|