Current section

Files

Jump to
timex lib comparable datetime.ex
Raw

lib/comparable/datetime.ex

defimpl Timex.Comparable, for: DateTime do
alias Timex.AmbiguousDateTime
alias Timex.Comparable.Utils
alias Timex.Comparable.Diff
import Timex.Macros
def compare(a, :epoch, granularity), do: compare(a, Timex.epoch(), granularity)
def compare(a, :zero, granularity), do: compare(a, Timex.zero(), granularity)
def compare(_, :distant_past, _granularity), do: +1
def compare(_, :distant_future, _granularity), do: -1
def compare(a, a, _granularity), do: 0
def compare(_, %AmbiguousDateTime{} = b, _granularity),
do: {:error, {:ambiguous_comparison, b}}
def compare(a, b, granularity),
do: Utils.to_compare_result(diff(a, b, granularity))
def diff(_, %AmbiguousDateTime{} = b, _granularity),
do: {:error, {:ambiguous_comparison, b}}
def diff(a, b, granularity) do
case {Timex.to_gregorian_microseconds(a), ok!(Timex.to_gregorian_microseconds(b))} do
{_, {:error, _} = err} -> err
{au, {:ok, bu}} -> Diff.diff(au, bu, granularity)
end
end
end