use std::borrow::Cow;
use std::hash::Hash;
use diskann::ANNResult;
use diskann_utils::future::AsyncFriendly;
pub trait Set<Element>: Clone + Default + IntoIterator<Item = Element> {
fn empty_set() -> Self;
fn intersection(&self, other: &Self) -> Self;
fn union(&self, other: &Self) -> Self;
fn insert(&mut self, value: &Element) -> ANNResult<bool>;
fn remove(&mut self, value: &Element) -> ANNResult<bool>;
fn contains(&self, value: &Element) -> ANNResult<bool>;
fn clear(&mut self) -> ANNResult<()>;
fn len(&self) -> ANNResult<usize>;
fn is_empty(&self) -> ANNResult<bool>;
}
pub trait SetProvider<Key, Value>: AsyncFriendly
where
Key: Clone + Eq + Hash,
Value: Clone + Eq + Hash,
{
type S: Set<Value> + AsyncFriendly;
fn get(&'_ self, key: &Key) -> ANNResult<Option<Cow<'_, Self::S>>>;
fn count(&self) -> ANNResult<usize>;
fn exists(&self, key: &Key) -> ANNResult<bool>;
fn insert(&mut self, key: &Key, value: &Value) -> ANNResult<bool>;
fn insert_values(&mut self, key: &Key, values: &[Value]) -> ANNResult<bool>;
fn delete(&mut self, key: &Key) -> ANNResult<bool>;
fn delete_from_set(&mut self, key: &Key, value: &Value) -> ANNResult<bool>;
fn clear(&mut self) -> ANNResult<()>;
}