use icu_calendar::{
Date,
cal::Hebrew,
options::{DateAddOptions, DateDifferenceOptions},
types::DateDuration,
};
mod amud_yomi_bavli_dirshu;
mod cycle;
mod daf_hashavua_bavli;
mod daf_yomi_bavli;
mod daf_yomi_yerushalmi;
mod interval;
mod limud;
mod mishna_yomis;
mod pirkei_avos;
mod tehillim_monthly;
mod units;
pub trait LimudCalendar {
fn limud<U>(&self, limud: impl Limud<U>) -> Option<U>;
}
impl<T> LimudCalendar for T
where
T: HebrewCalendarDate,
{
fn limud<U>(&self, limud: impl Limud<U>) -> Option<U> {
limud.limud(self.hebrew_date())
}
}
pub use amud_yomi_bavli_dirshu::AmudYomiBavliDirshu;
pub use daf_hashavua_bavli::DafHashavuaBavli;
pub use daf_yomi_bavli::DafYomiBavli;
pub use daf_yomi_yerushalmi::DafYomiYerushalmiVilna;
pub use mishna_yomis::{MishnaYomis, Mishnas};
pub use pirkei_avos::{PirkeiAvos, PirkeiAvosUnit};
pub use tehillim_monthly::{TehillimMonthly, TehillimUnit};
pub use units::{Amud, Daf, Mishna, Side, Tractate};
pub use limud::Limud;
use crate::calendar::HebrewCalendarDate;
pub mod prelude {
pub use super::{
Amud, AmudYomiBavliDirshu, Daf, DafHashavuaBavli, DafYomiBavli, DafYomiYerushalmiVilna, Limud, LimudCalendar,
Mishna, MishnaYomis, Mishnas, PirkeiAvos, PirkeiAvosUnit, Side, TehillimMonthly, TehillimUnit, Tractate,
};
}
pub(crate) trait HebrewDateExt {
fn add_days(&self, days: i32) -> Option<Date<Hebrew>>;
fn days_until(&self, end: &Date<Hebrew>) -> Option<u32>;
}
impl HebrewDateExt for Date<Hebrew> {
fn add_days(&self, days: i32) -> Option<Date<Hebrew>> {
self.try_added_with_options(DateDuration::for_days(days), DateAddOptions::default())
.ok()
}
fn days_until(&self, end: &Date<Hebrew>) -> Option<u32> {
if self > end {
return None;
}
match self.try_until_with_options(end, DateDifferenceOptions::default()) {
Ok(duration) => Some(duration.days),
Err(error) => match error {},
}
}
}
pub(crate) const BAVLI_TOTAL_AMUDIM: i32 = 5407;
pub(crate) const BAVLI_DAF_COUNT_EARLY: i32 = 2702;
pub(crate) const BAVLI_DAF_COUNT_MODERN: i32 = 2711;
pub(crate) const YERUSHALMI_DAF_COUNT: i32 = 1554;
pub(crate) const MISHNA_YOMIS_CYCLE_DAYS: i32 = 2095;
pub(crate) const SHEKALIM_EXPANSION_CYCLE: i32 = 8;
#[cfg(test)]
#[allow(clippy::expect_used)]
pub(crate) fn from_gregorian_date(year: i32, month: u8, day: u8) -> Date<Hebrew> {
Date::try_new_gregorian(year, month, day)
.expect("hard-coded Gregorian date should be valid")
.to_calendar(Hebrew)
}