Packages
vtc
0.3.9
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/sources/seconds.ex
defprotocol Vtc.Source.Seconds do
@moduledoc """
Protocol which types can implement to be passed as the main value of
`Timecode.with_seconds/3`.
## Implementations
Out of the box, this protocol is implemented for the following types:
- `Ratio`
- `Integer`
- `Float`
- `String`
- runtime ("01:00:00.0")
- decimal ("3600.0")
"""
alias Vtc.Framerate
alias Vtc.Timecode
alias Vtc.Utils.Rational
@typedoc """
Result type of `seconds/2`.
"""
@type result() :: {:ok, Rational.t()} | {:error, Timecode.ParseError.t()}
@doc """
Returns the value as a rational, real-world seconds value.
## Arguments
- **value**: The source value.
- **rate**: The framerate of the timecode being parsed.
## Returns
A result tuple with a rational representation of the seconds value using `Ratio` on
success.
"""
@spec seconds(t(), Framerate.t()) :: result()
def seconds(value, rate)
end
defimpl Vtc.Source.Seconds, for: [Ratio, Integer] do
alias Vtc.Framerate
alias Vtc.Private.Parse
alias Vtc.Source.Seconds
alias Vtc.Utils.Rational
@spec seconds(Rational.t(), Framerate.t()) :: Seconds.result()
def seconds(value, _rate), do: {:ok, value}
end
defimpl Vtc.Source.Seconds, for: Float do
alias Vtc.Framerate
alias Vtc.Source.Seconds
@spec seconds(float(), Framerate.t()) :: Seconds.result()
def seconds(value, rate), do: value |> Ratio.new(1) |> Seconds.seconds(rate)
end
defimpl Vtc.Source.Seconds, for: [String, BitString] do
alias Vtc.Framerate
alias Vtc.Private.Parse
alias Vtc.Source.Seconds
@spec seconds(String.t(), Framerate.t()) :: Seconds.result()
def seconds(value, rate),
do: Parse.parse_runtime_string(value, rate)
end