#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Kind {
Register,
Map,
Sequence,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Kinds {
register: bool,
map: bool,
sequence: bool,
}
impl Kinds {
#[must_use]
pub const fn new() -> Self {
Self {
register: false,
map: false,
sequence: false,
}
}
pub(super) const fn insert(&mut self, kind: Kind) {
match kind {
Kind::Register => self.register = true,
Kind::Map => self.map = true,
Kind::Sequence => self.sequence = true,
}
}
#[must_use]
pub const fn contains(self, kind: Kind) -> bool {
match kind {
Kind::Register => self.register,
Kind::Map => self.map,
Kind::Sequence => self.sequence,
}
}
#[must_use]
pub fn len(self) -> usize {
usize::from(self.register) + usize::from(self.map) + usize::from(self.sequence)
}
#[must_use]
pub const fn is_empty(self) -> bool {
!(self.register || self.map || self.sequence)
}
#[must_use]
pub const fn sole(self) -> Option<Kind> {
match (self.register, self.map, self.sequence) {
(true, false, false) => Some(Kind::Register),
(false, true, false) => Some(Kind::Map),
(false, false, true) => Some(Kind::Sequence),
_ => None,
}
}
pub fn iter(self) -> impl Iterator<Item = Kind> {
[
(self.register, Kind::Register),
(self.map, Kind::Map),
(self.sequence, Kind::Sequence),
]
.into_iter()
.filter_map(|(present, kind)| present.then_some(kind))
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct KindPlurality {
pub kinds: Kinds,
}