lib/math/interval.ex

defmodule Interval do
  @moduledoc """
  Documentation for `Interval`.
  """

  @doc """
  Checks if number is in interval <min, max>. Works with integers or floats up to 15 decimal places.

  ## Examples

      iex> Interval.member?(1, 2, 1)
      true

      iex> Interval.member?(-3, 5, 0)
      true

      iex> Interval.member?(-3.0003, 2.12, 2.13)
      false

  """
  @spec member?(number, number, number):: boolean | nil
  def member?(min, max, _) when min > max, do: nil
  def member?(min, max, x), do: x >= min && x <= max


  @doc """
  Checks if interval is contained in the second one

  ## Examples

      iex> Interval.contained?(1..2, 1..2)
      true

      iex> Interval.contained?(1..2, 1..3)
      true

      iex> Interval.contained?(-5..-3, -4..3)
      false

  """
  @spec contained?(Range.t(), Range.t()) :: boolean
  def contained?(min..max, destination_range) do
    Enum.member?(destination_range, min) && Enum.member?(destination_range, max)
  end

  @doc """
  Returns random integer in <min, max> range

  ## Examples

      iex> Interval.random_number(1, 1)

      iex> Interval.random_number(-31, 5)

      iex> Interval.random_number(-31, -75)
      nil

  """
  @spec random_number(integer, integer):: integer | nil
  def random_number(min, max) when min > max, do: nil
  def random_number(min, max), do: Enum.random(min..max)

end