#[derive(Debug)]
pub struct OrderedSet<K, E> {
table: OrderedTable<K, (), E>,
}
impl<K, E> OrderedSet<K, E>
where
E: KeyEquivalence<K>,
{
pub fn new(equivalence: E) -> Self {
Self {
table: OrderedTable::new(equivalence),
}
}
pub fn len(&self) -> usize {
self.table.len()
}
pub fn is_empty(&self) -> bool {
self.table.is_empty()
}
pub fn contains(&self, key: &K) -> bool {
self.table.get(key).is_some()
}
pub fn insert(&self, key: K) -> bool {
self.table.insert(key, ()).is_none()
}
pub fn remove(&self, key: &K) -> bool {
self.table.remove(key).is_some()
}
pub fn iter(&self) -> OrderedSetIter<K> {
OrderedSetIter {
inner: self.table.iter(),
}
}
pub fn compact(&self, max_work: usize) -> CompactionResult {
self.table.compact(max_work)
}
}
pub struct OrderedSetIter<K> {
inner: OrderedTableIter<K, ()>,
}
impl<K> Clone for OrderedSetIter<K> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<K> Iterator for OrderedSetIter<K>
where
K: Clone,
{
type Item = K;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(key, ())| key)
}
}