defmodule Frugality.Encoder do
@moduledoc """
A behaviour for entity-tag encoding.
Defines a single callback - `c:Frugality.Encoder.encode/1`, which
expects an `t:iodata/0` and returns a `t:binary/0`.
The callback signature is required, instead of simply expecting and
returning a `t:binary/0`, because one can represent the entity-tag's
source as an `t:iolist/0`.
"""
@type t() :: module()
@callback encode(iodata()) :: binary()
defguardp is_iodata(term) when is_binary(term) or is_list(term)
@doc false
@spec encode(module(), iodata()) :: binary()
def encode(impl, iodata) when is_atom(impl) and is_iodata(iodata) do
impl.encode(iodata)
end
end