use std::collections::btree_map::{IntoKeys, Keys}; use std::ops::Deref; use crate::GMap; use crate::Semilattice; /// Grow-only set. #[derive(Debug, Clone, PartialEq, Eq)] pub struct GSet { inner: GMap, } impl GSet { pub fn singleton(key: K) -> Self { Self { inner: GMap::from_iter([(key, ())]), } } pub fn insert(&mut self, key: K) { self.inner.insert(key, ()); } pub fn iter(&self) -> Keys<'_, K, ()> { self.inner.keys() } } impl FromIterator for GSet { fn from_iter>(iter: I) -> Self { let mut map = GSet::default(); for k in iter.into_iter() { map.insert(k); } map } } impl Extend for GSet { fn extend>(&mut self, iter: I) { for k in iter.into_iter() { self.insert(k); } } } impl IntoIterator for GSet { type Item = K; type IntoIter = IntoKeys; fn into_iter(self) -> Self::IntoIter { self.inner.into_keys() } } impl Default for GSet { fn default() -> Self { Self { inner: GMap::default(), } } } impl Semilattice for GSet { fn merge(&mut self, other: Self) { for k in other.into_iter() { self.insert(k); } } } impl Deref for GSet { type Target = GMap; fn deref(&self) -> &Self::Target { &self.inner } } #[cfg(test)] mod tests { use qcheck_macros::quickcheck; use super::*; #[quickcheck] fn prop_semilattice(a: Vec, b: Vec, c: Vec, mix: Vec) { let mut a = GSet::from_iter(a); let mut b = GSet::from_iter(b); let c = GSet::from_iter(c); a.extend(mix.clone()); b.extend(mix); crate::test::assert_laws(&a, &b, &c); } }