Packages

Discordian Date system library

Current section

Files

Jump to
ddate lib ddate.ex
Raw

lib/ddate.ex

defmodule Ddate do
@moduledoc """
Elixir implementation of the classic Discordian Date system
which converts Gregorian Dates to Discordian Dates.
"""
@doc """
Ddate.ddate
Returns Discordian Date as a string for the current date.
"""
def ddate do
{date, _time} = :erlang.localtime()
ddate(date)
end
@doc """
Ddate.ddate({year, month, day})
Returns Discordian Date as a string for the provided date in
erlang tuple format.
"""
def ddate({year, month, day}) do
isTibs = :calendar.is_leap_year(year)
getdate(isTibs, daynum({year, month, day}))
|> formatddate(year)
end
defp getdate(false, daynum) do
{false, div(daynum, 73), rem(daynum, 73) + 1, rem(daynum, 5)}
end
defp getdate(true, daynum) when daynum < 59 do
{false, div(daynum, 73), rem(daynum, 73) + 1, rem(daynum, 5)}
end
defp getdate(true, 59) do
{:sttibs, 0, 0, 0}
end
defp getdate(true, daynum) when daynum > 59 do
newdaynum = daynum - 1
{false, div(newdaynum, 73), rem(newdaynum, 73) + 1, rem(newdaynum, 5)}
end
defp formatddate({:sttibs, _, _, _}, year) do
"St Tibs Day, YOLD #{year + 1166}"
end
defp formatddate({false, season, 5, day}, year) do
"#{longday(day)}, St #{longpatron(season)} of #{longseason(season)} YOLD #{year + 1166}"
end
defp formatddate({false, season, 50, day}, year) do
"#{longday(day)}, #{longholyday(season)} of #{longseason(season)} YOLD #{year + 1166}"
end
defp formatddate({false, season, date, day}, year) do
"#{longday(day)}, #{date}#{ordinal(date)} of #{longseason(season)} YOLD #{year + 1166}"
end
defp daynum({year, month, day}) do
:calendar.date_to_gregorian_days({year, month, day})
|> :erlang.-(:calendar.date_to_gregorian_days({year, 1, 1}))
end
defp longseason(0), do: "Chaos"
defp longseason(1), do: "Discord"
defp longseason(2), do: "Confusion"
defp longseason(3), do: "Bureaucracy"
defp longseason(4), do: "The Aftermath"
defp longday(0), do: "Sweetmorn"
defp longday(1), do: "Boomtime"
defp longday(2), do: "Pungenday"
defp longday(3), do: "Prickle-Prickle"
defp longday(4), do: "Setting Orange"
defp longpatron(0), do: "Mungday"
defp longpatron(1), do: "Mojoday"
defp longpatron(2), do: "Syaday"
defp longpatron(3), do: "Zaraday"
defp longpatron(4), do: "Maladay"
defp longholyday(0), do: "Chaoflux"
defp longholyday(1), do: "Discoflux"
defp longholyday(2), do: "Confuflux"
defp longholyday(3), do: "Bureflux"
defp longholyday(4), do: "Afflux"
defp ordinal(number) when number in [10, 11, 12, 13], do: "th"
defp ordinal(number) when rem(number, 10) == 1, do: "st"
defp ordinal(number) when rem(number, 10) == 2, do: "nd"
defp ordinal(number) when rem(number, 10) == 3, do: "rd"
defp ordinal(_), do: "th"
end