lib/fraction.ex

defmodule Fraction do
  @moduledoc """
  Module to handle fractions
  """

  @typedoc """
   Rational numbers (num/den)
  """
  @type t :: %Fraction{
          num: integer,
          den: non_neg_integer
        }

  defstruct num: 0, den: 1

  @doc """
  Function to convert a Fraction struct to negative

  ## Examples
      iex> fraction = %Fraction{num: 2, den: 4}
      iex> Fraction.negative(fraction)
      %Fraction{num: -2, den: 4}
  """
  @spec negative(t()) :: t()
  def negative(%Fraction{} = fraction) do
    %Fraction{num: -fraction.num, den: fraction.den}
  end

  @doc """
  Function to convert Fraction struct to a floating point number

  Returns floating point number.

  ## Examples

      iex> fraction = %Fraction{num: 3, den: 6}
      iex> Fraction.to_float(fraction)
      0.5
  """
  @spec to_float(t()) :: float()
  def to_float(%Fraction{} = fraction) do
    fraction.num / fraction.den
  end
end