Packages
vtc
0.1.2
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/timecode_sources.ex
defmodule Vtc.Sources do
@moduledoc """
Protocols for source values that can be used to construct a timecode.
"""
use Ratio
@typedoc """
Result type of `Vtc.Sources.Seconds.seconds/2`.
"""
@type seconds_result :: {:ok, Ratio.t() | integer} | {:error, Vtc.Timecode.ParseError.t()}
defprotocol Seconds do
@moduledoc """
Protocol which types can implement to be passed as the main value of
`Vtc.Timecode.with_seconds/2`.
# Implementations
Out of the box, this protocol is implemented for the following types:
- `Ratio`
- `Integer`
- `Float`
"""
@doc """
Returns the value as a rational 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, Vtc.Framerate.t()) :: Vtc.Sources.seconds_result()
def seconds(value, rate)
end
defimpl Seconds, for: [Ratio, Integer] do
@spec seconds(Ratio.t() | integer, Vtc.Framerate.t()) :: Vtc.Sources.seconds_result()
def seconds(value, rate), do: Private.from_seconds_core(value, rate)
end
defimpl Seconds, for: Float do
@spec seconds(float, Vtc.Framerate.t()) :: Vtc.Sources.seconds_result()
def seconds(value, rate), do: Seconds.seconds(Ratio.new(value, 1), rate)
end
@typedoc """
Result type of `Vtc.Sources.Frames.frames/2`.
"""
@type frames_result :: {:ok, integer} | {:error, Vtc.Timecode.ParseError.t()}
defprotocol Frames do
@moduledoc """
Protocol which types can implement to be passed as the main value of
`Vtc.Timecode.with_frames/2`.
# Implementations
Out of the box, this protocol is implemented for the following types:
- `Integer`
- `String`
- `Bitstring`
"""
@doc """
Returns the value as a frame count.
# Arguments
- **value**: The source value.
- **rate**: The framerate of the timecode being parsed.
# Returns
A result tuple with an integer value representing the frame count on success.
"""
@spec frames(t, Vtc.Framerate.t()) :: Vtc.Sources.frames_result()
def frames(value, rate)
end
defimpl Frames, for: Integer do
@spec frames(integer, Vtc.Framerate.t()) :: Vtc.Sources.frames_result()
def frames(value, _rate), do: {:ok, value}
end
defimpl Frames, for: [String, BitString] do
@spec frames(String.t() | Bitstring, Vtc.Framerate.t()) :: Vtc.Sources.frames_result()
def frames(value, rate), do: Private.parse_tc_string(value, rate)
end
end