lib/multitool/numbers/triangular.ex

defmodule Multitool.Numbers.Triangular do
  @moduledoc """
  Provides operations for working with triangular numbers

  A triangular number is generated by adding the natural numbers up to 
  and including the number `n`.

  The 4th triangular number, for example, can be calculated as follows:

  `1 + 2 + 3 + 4 = 10`

  """
  @moduledoc since: "0.1.0"

  @doc """
  Returns a list of the first `n` triangle numbers, starting at one

  If `n` is less than one, an empty list is returned

  ## Parameters

      n: The number of triangle numbers to retrieve

  ## Examples

      iex> triangle_nums(3)
      [1, 3, 6]
      iex> triangle_nums(-1)
      []
      iex> triangle_nums(5)
      [1, 3, 6, 10, 15]
  """
  @doc since: "0.1.0"
  def triangle_nums(n) when n > 0 do
    Stream.iterate(1, &(&1 + 1))
    |> Enum.take(n)
    |> Enum.map(&nth_triangle_num(&1))
  end

  def triangle_nums(_n), do: []

  @doc """
  Returns the nth triangle number where the first triangle number is one.

  If `n` is less than one, zero is returned


  ## Parameters

      n: The nth triangle number to retrieve

  ## Examples

      iex> nth_triangle_num(3)
      6
      iex> nth_triangle_num(-1)
      0
      iex> nth_triangle_num(34)
      595
  """
  @doc since: "0.1.0"
  def nth_triangle_num(n) when n > 0 do
    n + nth_triangle_num(n - 1)
  end

  def nth_triangle_num(_n), do: 0
end