use std::collections::HashSet;
use std::hash::Hash;
#[derive(Debug, Clone)]
pub struct SeqSet<T>
where
T: Eq + Hash + Clone,
{
set: HashSet<T>, vec: Vec<T>, }
impl<T> SeqSet<T>
where
T: Eq + Hash + Clone,
{
pub fn new() -> Self {
SeqSet {
set: HashSet::new(),
vec: Vec::new(),
}
}
pub fn insert(&mut self, value: T) -> bool {
if self.set.insert(value.clone()) {
self.vec.push(value);
true
} else {
false
}
}
pub fn contains(&self, value: &T) -> bool {
self.set.contains(value)
}
pub fn remove(&mut self, value: &T) -> bool {
if self.set.remove(value) {
if let Some(pos) = self.vec.iter().position(|x| x == value) {
self.vec.remove(pos);
}
true
} else {
false
}
}
pub fn len(&self) -> usize {
self.set.len()
}
pub fn is_empty(&self) -> bool {
self.set.is_empty()
}
pub fn iter(&self) -> SeqSetIter<'_, T> {
SeqSetIter {
inner: self.vec.iter(),
}
}
pub fn iter_mut(&mut self) -> SeqSetIterMut<'_, T> {
SeqSetIterMut {
inner: self.vec.iter_mut(),
}
}
pub fn clear(&mut self) {
self.set.clear();
self.vec.clear();
}
pub fn to_vec(&self) -> Vec<T> {
self.vec.clone()
}
}
pub struct SeqSetIter<'a, T>
where
T: Eq + Hash + Clone,
{
inner: std::slice::Iter<'a, T>,
}
impl<'a, T> Iterator for SeqSetIter<'a, T>
where
T: Eq + Hash + Clone,
{
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
}
impl<'a, T> IntoIterator for &'a SeqSet<T>
where
T: Eq + Hash + Clone,
{
type Item = &'a T;
type IntoIter = SeqSetIter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
pub struct SeqSetIterMut<'a, T>
where
T: Eq + Hash + Clone,
{
inner: std::slice::IterMut<'a, T>,
}
impl<'a, T> Iterator for SeqSetIterMut<'a, T>
where
T: Eq + Hash + Clone,
{
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
}
impl<'a, T> IntoIterator for &'a mut SeqSet<T>
where
T: Eq + Hash + Clone,
{
type Item = &'a mut T;
type IntoIter = SeqSetIterMut<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter_mut()
}
}
pub struct SeqSetIntoIter<T>
where
T: Eq + Hash + Clone,
{
inner: std::vec::IntoIter<T>,
}
impl<T> Iterator for SeqSetIntoIter<T>
where
T: Eq + Hash + Clone,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
}
impl<T> IntoIterator for SeqSet<T>
where
T: Eq + Hash + Clone,
{
type Item = T;
type IntoIter = SeqSetIntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
SeqSetIntoIter {
inner: self.vec.into_iter(),
}
}
}
impl<T> FromIterator<T> for SeqSet<T>
where
T: Eq + Hash + Clone,
{
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut seq_set = SeqSet::new();
for item in iter {
seq_set.insert(item);
}
seq_set
}
}
impl<T> From<SeqSet<T>> for Vec<T>
where
T: Eq + Hash + Clone,
{
fn from(set: SeqSet<T>) -> Self {
set.vec
}
}