pub const HEAVENLY_STEMS: [HeavenlyStem; 10] = [
HeavenlyStem::Jia,
HeavenlyStem::Yi,
HeavenlyStem::Bing,
HeavenlyStem::Ding,
HeavenlyStem::Wu,
HeavenlyStem::Ji,
HeavenlyStem::Geng,
HeavenlyStem::Xin,
HeavenlyStem::Ren,
HeavenlyStem::Gui,
];
pub const EARTHLY_BRANCHES: [EarthlyBranch; 12] = [
EarthlyBranch::Zi,
EarthlyBranch::Chou,
EarthlyBranch::Yin,
EarthlyBranch::Mao,
EarthlyBranch::Chen,
EarthlyBranch::Si,
EarthlyBranch::Wu,
EarthlyBranch::Wei,
EarthlyBranch::Shen,
EarthlyBranch::You,
EarthlyBranch::Xu,
EarthlyBranch::Hai,
];
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum HeavenlyStem {
Jia,
Yi,
Bing,
Ding,
Wu,
Ji,
Geng,
Xin,
Ren,
Gui,
}
impl HeavenlyStem {
pub const fn index(self) -> usize {
match self {
Self::Jia => 0,
Self::Yi => 1,
Self::Bing => 2,
Self::Ding => 3,
Self::Wu => 4,
Self::Ji => 5,
Self::Geng => 6,
Self::Xin => 7,
Self::Ren => 8,
Self::Gui => 9,
}
}
pub fn from_index(index: usize) -> Self {
HEAVENLY_STEMS[index % HEAVENLY_STEMS.len()]
}
pub fn offset(self, delta: isize) -> Self {
let len = HEAVENLY_STEMS.len() as isize;
let index = (self.index() as isize + delta).rem_euclid(len) as usize;
Self::from_index(index)
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum EarthlyBranch {
Zi,
Chou,
Yin,
Mao,
Chen,
Si,
Wu,
Wei,
Shen,
You,
Xu,
Hai,
}
impl EarthlyBranch {
pub const fn index(self) -> usize {
match self {
Self::Zi => 0,
Self::Chou => 1,
Self::Yin => 2,
Self::Mao => 3,
Self::Chen => 4,
Self::Si => 5,
Self::Wu => 6,
Self::Wei => 7,
Self::Shen => 8,
Self::You => 9,
Self::Xu => 10,
Self::Hai => 11,
}
}
pub fn from_index(index: usize) -> Self {
EARTHLY_BRANCHES[index % EARTHLY_BRANCHES.len()]
}
pub fn offset(self, delta: isize) -> Self {
let len = EARTHLY_BRANCHES.len() as isize;
let index = (self.index() as isize + delta).rem_euclid(len) as usize;
Self::from_index(index)
}
}