# `Calendrical.Ethiopic.AmeteAlem`

Implementation of the Ethiopic calendar with the *Amete Alem* (Era
of the World, *Anno Mundi*) year numbering.

This calendar is structurally identical to `Calendrical.Ethiopic` —
same 13-month layout, same leap-year rule, same days-in-month — but
the year is counted from the traditional Ethiopian Christian date
of the creation of the world rather than from the Era of Mercy:

    amete_alem_year = amete_mihret_year + 5500

So 1 Amete Alem = -5499 Julian = -5492-07-17 proleptic Gregorian
(per CLDR era data) and modern Ethiopic year 2017 (Amete Mihret) =
7517 Amete Alem.

Days are assumed to begin at midnight rather than at sunset.

## Reference

- Dershowitz & Reingold, *Calendrical Calculations* (4th ed.),
  §4.2 ("Ethiopic and Coptic Calendars").
- CLDR `:ethiopic_amete_alem` calendar type. The CLDR era data
  places the *aa* era at proleptic Gregorian `-5492-07-17`.

See `Calendrical.Ethiopic` for the month structure and the
`mod(year, 4) == 3` leap-year rule.

# `day`

```elixir
@type day() :: 1..30
```

# `month`

```elixir
@type month() :: 1..13
```

# `year`

```elixir
@type year() :: integer()
```

# `amete_alem_year`

```elixir
@spec amete_alem_year(integer()) :: year()
```

Returns the Amete Alem year for the given Amete Mihret
(`Calendrical.Ethiopic`) year.

### Arguments

* `amete_mihret_year` is any Amete Mihret (Ethiopic) year as an
  integer.

### Returns

* An integer Amete Alem year (5500 more than the input).

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.amete_alem_year(2018)
    7518

# `amete_mihret_year`

```elixir
@spec amete_mihret_year(year()) :: integer()
```

Returns the corresponding `Calendrical.Ethiopic` (Amete Mihret)
year for the given Amete Alem year.

### Arguments

* `amete_alem_year` is any Amete Alem year as an integer.

### Returns

* An integer Amete Mihret year (5500 less than the input).

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.amete_mihret_year(7518)
    2018

# `calendar_base`

Identifies whether this calendar is month
or week based.

# `calendar_year`

```elixir
@spec calendar_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()
```

Returns the calendar year as displayed
on rendered calendars.

# `cldr_calendar_type`

Defines the CLDR calendar type for this calendar.

This type is used in support of `Calendrical.
localize/3`.

# `cyclic_year`

```elixir
@spec cyclic_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()
```

Returns the cyclic year as displayed
on rendered calendars.

# `date_from_iso_days`

```elixir
@spec date_from_iso_days(integer()) :: {year(), month(), day()}
```

Returns an Amete Alem `{year, month, day}` tuple for the given
ISO day number.

### Arguments

* `iso_days` is an integer count of days since the proleptic
  ISO epoch.

### Returns

* A three-tuple `{year, month, day}` in Amete Alem numbering.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.date_from_iso_days(740_000)
    {7518, 5, 11}

# `date_to_iso_days`

```elixir
@spec date_to_iso_days(year(), month(), day()) :: integer()
```

Returns the number of ISO days for the given Amete Alem `year`,
`month`, and `day`.

### Arguments

* `year` is any Amete Alem year as an integer.

* `month` is an Ethiopic month in the range `1..13`.

* `day` is an Ethiopic day-of-month.

### Returns

* An integer count of days since the proleptic ISO epoch.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.date_to_iso_days(7518, 1, 1)
    739870

# `day_of_era`

```elixir
@spec day_of_era(Calendar.year(), Calendar.month(), Calendar.day()) ::
  {day :: Calendar.day(), era :: Calendar.era()}
```

Calculates the day and era from the given
`year`, `month`, and `day`.

By default we consider on two eras: before the epoch
and on-or-after the epoch.

# `day_of_week`

```elixir
@spec day_of_week(
  Calendar.year(),
  Calendar.month(),
  Calendar.day(),
  :default | atom()
) ::
  {Calendar.day_of_week(), first_day_of_week :: non_neg_integer(),
   last_day_of_week :: non_neg_integer()}
@spec day_of_week(year(), month(), day(), :default) :: {1..7, 6, 5}
```

Returns the day of the week for the given Amete Alem `year`,
`month`, and `day`.

Ethiopic weeks begin on Saturday, so the returned tuple has
`first_day_of_week = 6` and `last_day_of_week = 5`.

### Arguments

* `year` is any Amete Alem year as an integer.

* `month` is an Ethiopic month in the range `1..13`.

* `day` is an Ethiopic day-of-month.

* `starting_on` is `:default` for the calendar's natural week
  boundary (Saturday).

### Returns

* A three-tuple `{day_of_week, first_day_of_week, last_day_of_week}`.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.day_of_week(7518, 1, 1, :default)
    {4, 6, 5}

# `day_of_year`

```elixir
@spec day_of_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendar.day()
```

Calculates the day of the year from the given
`year`, `month`, and `day`.

# `days_in_month`

```elixir
@spec days_in_month(Calendar.month()) ::
  Calendar.month()
  | {:ambiguous, Range.t() | [pos_integer()]}
  | {:error, :undefined}
```

Returns how many days there are in the given month.

Must be implemented in derived calendars because
we cannot know what the calendar format is.

# `days_in_month`

```elixir
@spec days_in_month(Calendar.year(), Calendar.month()) :: Calendar.month()
@spec days_in_month(year(), month()) :: 5..30
```

Returns the number of days in the given Amete Alem `year` and
`month`.

Months 1-12 always have 30 days; month 13 has 5 days, or 6
in a leap year.

### Arguments

* `year` is any Amete Alem year as an integer.

* `month` is an Ethiopic month in the range `1..13`.

### Returns

* An integer number of days.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.days_in_month(7518, 13)
    5

    iex> Calendrical.Ethiopic.AmeteAlem.days_in_month(7519, 13)
    6

# `days_in_week`

Returns the number days in a a week.

# `days_in_year`

```elixir
@spec days_in_year(year()) :: 365..366
```

Returns the number of days in the given Amete Alem `year`.

### Arguments

* `year` is any Amete Alem year as an integer.

### Returns

* `365` for an ordinary year or `366` for a leap year.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.days_in_year(7518)
    365

    iex> Calendrical.Ethiopic.AmeteAlem.days_in_year(7519)
    366

# `epoch`

# `epoch_day_of_week`

# `era_offset`

```elixir
@spec era_offset() :: 5500
```

Returns the offset (in years) between the Amete Alem (Era of the
World) and the Amete Mihret (Era of Mercy) used by
`Calendrical.Ethiopic`.

Subtracting this offset from an Amete Alem year yields the
corresponding Amete Mihret year.

### Returns

* The integer `5500`.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.era_offset()
    5500

# `extended_year`

```elixir
@spec extended_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()
```

Returns the extended year as displayed
on rendered calendars.

# `first_day_of_week`

# `iso_week_of_year`

```elixir
@spec iso_week_of_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  {:error, :not_defined}
```

Calculates the ISO week of the year from the
given `year`, `month`, and `day`.

By default this function always returns
`{:error, :not_defined}`.

# `last_day_of_week`

# `leap_year?`

```elixir
@spec leap_year?(year()) :: boolean()
```

Returns whether the given Amete Alem `year` is a leap year.

The leap-year rule is that of `Calendrical.Ethiopic` applied to
the corresponding Amete Mihret year.

### Arguments

* `year` is any Amete Alem year as an integer.

### Returns

* `true` if the year contains 366 days; otherwise `false`.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.leap_year?(7519)
    true

    iex> Calendrical.Ethiopic.AmeteAlem.leap_year?(7518)
    false

# `month`

Returns a `t:Date.Range.t/0` representing
a given month of a year.

# `month_of_year`

```elixir
@spec month_of_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.month() | {Calendar.month(), Calendrical.leap_month?()}
```

Returns the month of the year from the given
`year`, `month`, and `day`.

# `months_in_leap_year`

Returns the number of months in a leap year.

# `months_in_ordinary_year`

Returns the number of months in a normal year.

# `months_in_year`

Returns the number of months in a year, without a year.

Returns an integer when every year has the same number of
months, or `{:ambiguous, first..last}` for lunisolar calendars
whose year length varies (e.g. the Hebrew calendar's 12 or 13
months).

# `months_in_year`

Returns the number of months in a
given `year`.

# `naive_datetime_from_iso_days`

```elixir
@spec naive_datetime_from_iso_days(Calendar.iso_days()) ::
  {Calendar.year(), Calendar.month(), Calendar.day(), Calendar.hour(),
   Calendar.minute(), Calendar.second(), Calendar.microsecond()}
```

Converts the `t:Calendar.iso_days` format to the
datetime format specified by this calendar.

# `naive_datetime_to_iso_days`

```elixir
@spec naive_datetime_to_iso_days(
  Calendar.year(),
  Calendar.month(),
  Calendar.day(),
  Calendar.hour(),
  Calendar.minute(),
  Calendar.second(),
  Calendar.microsecond()
) :: Calendar.iso_days()
```

Returns the `t:Calendar.iso_days` format of
the specified date.

# `periods_in_year`

Returns the number of periods in a given
`year`. A period corresponds to a month
in month-based calendars and a week in
week-based calendars.

# `plus`

Adds an `increment` number of `date_part`s
to a `year-month-day`.

`date_part` can be `:years`, `:months`, `:weeks` or `:days`.

# `quarter`

Returns a `t:Date.Range.t/0` representing
a given quarter of a year.

# `quarter_of_year`

```elixir
@spec quarter_of_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendrical.quarter()
```

Returns `{:error, :not_defined}` because the Ethiopic calendar
does not define quarters; the year has 13 months and so does not
divide evenly into four quarters.

### Arguments

* `year` is any Amete Alem year as an integer.

* `month` is an Ethiopic month in the range `1..13`.

* `day` is an Ethiopic day-of-month.

### Returns

* `{:error, :not_defined}`.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.quarter_of_year(7518, 1, 1)
    {:error, :not_defined}

# `related_gregorian_year`

```elixir
@spec related_gregorian_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()
```

Returns the related Gregorian year as displayed
on rendered calendars.

Per TR35 this is the Gregorian year in which this
calendar's `year` begins, so it is constant for every
date of the calendar year.

# `valid_date?`

```elixir
@spec valid_date?(year(), month(), day()) :: boolean()
```

Returns whether the given `year`, `month`, and `day` form a valid
Amete Alem date.

### Arguments

* `year` is any Amete Alem year as an integer.

* `month` is an Ethiopic month in the range `1..13`.

* `day` is an Ethiopic day-of-month. Months `1..12` have 30 days;
  month 13 has 5 days, or 6 in a leap year.

### Returns

* `true` if the date is valid; otherwise `false`.

### Examples

    iex> Calendrical.Ethiopic.AmeteAlem.valid_date?(7518, 1, 30)
    true

    iex> Calendrical.Ethiopic.AmeteAlem.valid_date?(7519, 13, 6)
    true

    iex> Calendrical.Ethiopic.AmeteAlem.valid_date?(7518, 13, 6)
    false

# `week`

Returns a `t:Date.Range.t/0` representing
a given week of a year.

# `week_of_month`

```elixir
@spec week_of_month(Calendar.year(), Calendar.month(), Calendar.day()) ::
  {pos_integer(), pos_integer()} | {:error, :not_defined}
```

Calculates the week of the year from the given
`year`, `month`, and `day`.

By default this function always returns
`{:error, :not_defined}`.

# `week_of_year`

```elixir
@spec week_of_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  {:error, :not_defined}
```

Calculates the week of the year from the given
`year`, `month`, and `day`.

By default this function always returns
`{:error, :not_defined}`.

# `weeks_in_year`

Returns the number of weeks in a
given `year`.

# `year`

Returns a `t:Date.Range.t/0` representing
a given year.

# `year_of_era`

```elixir
@spec year_of_era(Calendar.year()) :: {year :: Calendar.year(), era :: Calendar.era()}
```

Calculates the year and era from the given `year`.

# `year_of_era`

```elixir
@spec year_of_era(Calendar.year(), Calendar.month(), Calendar.day()) ::
  {year :: Calendar.year(), era :: Calendar.era()}
```

Calculates the year and era from the given `date`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
