defprotocol Moar.Difference do # @related [test](/test/difference_test.exs) @moduledoc """ A protocol that defines `diff/2` for finding the difference between two terms. Includes implementations for `DateTime`, `NaiveDateTime`, and `BitString`. """ @fallback_to_any true @doc """ Returns the difference between `a` and `b`. The fallback implementation uses `Kernel.-/2` to subtract `b` from `a`. """ @spec diff(any(), any()) :: any() def diff(a, b) end defimpl Moar.Difference, for: Any do def diff(a, b), do: a - b end defimpl Moar.Difference, for: DateTime do def diff(a, b), do: DateTime.diff(a, b, :microsecond) end defimpl Moar.Difference, for: NaiveDateTime do def diff(a, b), do: NaiveDateTime.diff(a, b, :microsecond) end defimpl Moar.Difference, for: BitString do def diff(a, b), do: DateTime.diff(Moar.DateTime.from_iso8601!(a), Moar.DateTime.from_iso8601!(b), :microsecond) end