Current section
Files
Jump to
Current section
Files
lib/list.ex
defmodule Rivet.Utils.List do
@moduledoc """
Contributor: Brandon Gillespie
"""
@doc """
Inefficient but simple set operations.
Maintains order, returns a list, uses a "getter" function to pull the value
iex> setadd([1,2,3], 3, &(&1))
[1,2,3]
iex> setadd([1,2,3], 4, &(&1))
[1,2,3,4]
"""
def setadd(list, elem, getter) do
check_elem = getter.(elem)
if is_nil(Enum.find(list, fn e -> getter.(e) == check_elem end)) do
list ++ [elem]
else
list
end
end
@doc """
Inefficient but simple set operations.
Maintains order, returns a list, uses a "getter" function to pull the value
iex> setremove([1,2,3], 3, &(&1))
[1,2]
iex> setremove([1,2,3], 4, &(&1))
[1,2,3]
"""
def setremove(list, elem, getter) do
check_elem = getter.(elem)
Enum.filter(list, fn e -> getter.(e) != check_elem end)
end
@doc """
# TODO: switch to Enum.take()
iex> trim([1,2,3,4,5], 3)
[1,2,3]
iex> trim([1,2,3,4], 10)
[1,2,3,4]
iex> trim([1,2,3,4,5], 0)
[]
"""
def trim(list, length) do
if length(list) > length do
pop(list) |> trim(length)
else
list
end
end
@doc """
iex> pop([1,2,3,4,5])
[1,2,3,4]
"""
def pop(list), do: list |> :lists.reverse() |> tl() |> :lists.reverse()
@doc """
iex> put_different([], 20, 10, :last_off)
[last_off: 10]
iex> put_different([], 10, 10, :last_off)
[]
"""
def put_different(chgs, same, same, _), do: chgs
def put_different(chgs, _old, new, key), do: [{key, new} | chgs]
end