///|
fn ordinal_epoch() -> Int {
days_from_civil(1, 1, 1)
}
///|
/// Return a zero-based ordinal suitable for compact storage.
pub fn Date::ordinal(self : Date) -> Int {
days_from_civil(self.year, self.month, self.day) - ordinal_epoch()
}
///|
/// Restore a date from a zero-based ordinal.
pub fn Date::from_ordinal(ordinal : Int) -> Result[Date, DateError] {
if ordinal < 0 {
return Err(OutOfRange)
}
let (year, month, day) = civil_from_days(ordinal + ordinal_epoch())
if year < 1 || year > 9999 {
Err(OutOfRange)
} else {
Ok({ year, month, day })
}
}