use crate::{api::set::SetScanResult, error::Result, traits::DbLike};
pub trait Set: DbLike {
fn sadd<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn srem<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn smembers<K: AsRef<[u8]>>(&self, key: K) -> Result<Vec<Vec<u8>>>;
fn sismember<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<bool>;
fn smismember<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<Vec<bool>>;
fn scard<K: AsRef<[u8]>>(&self, key: K) -> Result<u64>;
fn spop<K: AsRef<[u8]>>(&self, key: K, count: usize) -> Result<Vec<Vec<u8>>>;
fn siter<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
where
F: FnMut(&[u8]) -> bool;
fn srandmember<K: AsRef<[u8]>>(&self, key: K, count: i64) -> Result<Vec<Vec<u8>>>;
fn smove<SK: AsRef<[u8]>, DK: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
src: SK,
dst: DK,
member: M,
) -> Result<bool>;
fn overwrite_set<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn sinter<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<Vec<u8>>>;
fn sinterstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(&self, dst: D, keys: &[K]) -> Result<usize>;
fn sintercard<K: AsRef<[u8]>>(&self, keys: &[K], limit: usize) -> Result<usize>;
fn sunion<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<Vec<u8>>>;
fn sunionstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(&self, dst: D, keys: &[K]) -> Result<usize>;
fn sunioncard<K: AsRef<[u8]>>(&self, keys: &[K], limit: usize) -> Result<usize>;
fn sdiff<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<Vec<u8>>>;
fn sdiffstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(&self, dst: D, keys: &[K]) -> Result<usize>;
fn sdiffcard<K: AsRef<[u8]>>(&self, keys: &[K], limit: usize) -> Result<usize>;
fn sscan<K: AsRef<[u8]>>(
&self,
key: K,
cursor: usize,
pattern: Option<&[u8]>,
count: Option<usize>,
) -> Result<SetScanResult>;
}