Packages
vtc
0.2.1
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.15
0.13.14
0.13.13
0.13.12
0.13.11
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.10
0.10.9
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
A SMPTE timecode library for Elixir
Current section
Files
Jump to
Current section
Files
lib/utils_rational.ex
defmodule Vtc.Utils.Rational do
@moduledoc """
Helper functions and types for working with the Ratio module.
"""
use Ratio, comparison: true
@typedoc """
The Ratio module will often convert itself to an integer value if the result would be
a whole number, but otherwise return a %Ratio{} struct.
This type can be used when working with such a value.
"""
@type t() :: Ratio.t() | integer()
@doc """
Rounds a Ratio to the nearest integer.
"""
@spec round(t()) :: integer()
def round(x) when is_integer(x), do: x
def round(%Ratio{} = x) do
floored = floor(x)
remainder = x - floored
if remainder > Ratio.new(1, 2), do: floored + 1, else: floored
end
@doc """
Does the divmod operation on a rational vale, returns a
{whole_dividend, rational_rainder} tuple.
"""
@spec divmod(t(), t()) :: {integer(), t()}
def divmod(a, b) do
dividend = floor(a / b)
multiplied = dividend * b
remainder = a - multiplied
{dividend, remainder}
end
end