use indexmap::IndexSet;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct Codepoints(IndexSet<char>);
impl Codepoints {
pub fn new(src: impl IntoIterator<Item = char>) -> Self {
Self(src.into_iter().collect())
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn set(&mut self, codepoints: impl IntoIterator<Item = char>) {
self.0.clear();
self.0.extend(codepoints);
}
pub fn clear(&mut self) {
self.0.clear();
}
pub fn contains(&self, codepoint: char) -> bool {
self.0.contains(&codepoint)
}
pub fn insert(&mut self, codepoint: char) -> bool {
self.0.insert(codepoint)
}
pub fn iter(&self) -> impl Iterator<Item = char> + '_ {
self.0.iter().copied()
}
}
impl FromIterator<char> for Codepoints {
fn from_iter<T: IntoIterator<Item = char>>(iter: T) -> Self {
Codepoints(iter.into_iter().collect())
}
}
impl IntoIterator for Codepoints {
type Item = char;
type IntoIter = indexmap::set::IntoIter<char>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a> IntoIterator for &'a Codepoints {
type Item = &'a char;
type IntoIter = indexmap::set::Iter<'a, char>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}