use crate::class::{ClassName, HasClasses};
use alloc::fmt;
use smallvec::SmallVec;
#[derive(Debug, Default, Clone, Hash)]
pub struct Classes {
classes: SmallVec<[ClassName; 5]>,
}
impl Classes {
#[inline]
pub(crate) fn add_if(&mut self, class: impl Into<ClassName>, condition: bool) {
if condition {
self.set(class, true);
}
}
#[inline]
pub(crate) fn set(&mut self, class: impl Into<ClassName>, present: bool) {
let class = class.into();
self.classes.retain(|existing| existing != &class);
if present {
self.classes.push(class);
}
}
#[inline]
pub(crate) fn extend(&mut self, classes: impl IntoIterator<Item = impl Into<ClassName>>) {
for class in classes {
self.set(class, true);
}
}
#[inline]
pub fn iter(&self) -> core::slice::Iter<'_, ClassName> {
self.classes.iter()
}
#[inline]
pub fn as_slice(&self) -> &[ClassName] {
self.classes.as_slice()
}
}
impl IntoIterator for Classes {
type Item = ClassName;
type IntoIter = smallvec::IntoIter<[ClassName; 5]>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.classes.into_iter()
}
}
impl<'a> IntoIterator for &'a Classes {
type Item = &'a ClassName;
type IntoIter = core::slice::Iter<'a, ClassName>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.classes.iter()
}
}
impl HasClasses for Classes {
fn classes(&self) -> &Classes {
self
}
fn classes_mut(&mut self) -> &mut Classes {
self
}
}
impl core::fmt::Display for Classes {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for (i, class) in self.classes.iter().enumerate() {
if i > 0 {
f.write_str(" ")?;
}
f.write_str(class.as_str())?;
}
Ok(())
}
}