use rapidhash::RapidHashMap as HashMap;
use crate::{
api::zset::{
ZScanResult, ZSetKeyMemberScore, ZSetMemberScore,
conf::{Aggregate, RangeLexSpec, RangeScoreSpec, ZAdd, ZRangeSpec},
},
error::Result,
traits::DbLike,
};
pub trait ZSet: DbLike {
fn ziter<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_rev<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_members<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_members_rev<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_range_byscore<K: AsRef<[u8]>, F>(
&self,
key: K,
spec: &RangeScoreSpec,
f: F,
) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_range_byscore_rev<K: AsRef<[u8]>, F>(
&self,
key: K,
spec: &RangeScoreSpec,
f: F,
) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_range_bylex<K: AsRef<[u8]>, F>(&self, key: K, spec: &RangeLexSpec, f: F) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn ziter_range_bylex_rev<K: AsRef<[u8]>, F>(
&self,
key: K,
spec: &RangeLexSpec,
f: F,
) -> Result<()>
where
F: FnMut(&[u8], f64) -> bool;
fn zget_all<K: AsRef<[u8]>>(&self, key: K) -> Result<Vec<ZSetMemberScore>>;
fn zadd<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
score_members: &[(f64, M)],
conf_li: impl AsRef<[ZAdd]>,
) -> Result<usize>;
fn zrem<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
fn zscore<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<Option<f64>>;
fn zmscore<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
members: &[M],
) -> Result<Vec<Option<f64>>>;
fn zmget<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
members: &[M],
) -> Result<HashMap<Vec<u8>, f64>>;
fn zcard<K: AsRef<[u8]>>(&self, key: K) -> Result<u64>;
fn zcount<K: AsRef<[u8]>>(&self, key: K, spec: &RangeScoreSpec) -> Result<u64>;
fn zlexcount<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<u64>;
fn zincrby<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
increment: f64,
member: M,
) -> Result<f64>;
fn zrank<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<Option<u64>>;
fn zrank_with_score<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
member: M,
) -> Result<Option<(u64, f64)>>;
fn zrevrank<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<Option<u64>>;
fn zrevrank_with_score<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
member: M,
) -> Result<Option<(u64, f64)>>;
fn zrange<K: AsRef<[u8]>>(&self, key: K, start: i64, stop: i64) -> Result<Vec<ZSetMemberScore>>;
fn zrevrange<K: AsRef<[u8]>>(
&self,
key: K,
start: i64,
stop: i64,
) -> Result<Vec<ZSetMemberScore>>;
fn zrangebyscore<K: AsRef<[u8]>>(
&self,
key: K,
spec: &RangeScoreSpec,
) -> Result<Vec<ZSetMemberScore>>;
fn zrevrangebyscore<K: AsRef<[u8]>>(
&self,
key: K,
spec: &RangeScoreSpec,
) -> Result<Vec<ZSetMemberScore>>;
fn zrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<Vec<Vec<u8>>>;
fn zrangebylex_with_scores<K: AsRef<[u8]>>(
&self,
key: K,
spec: &RangeLexSpec,
) -> Result<Vec<ZSetMemberScore>>;
fn zrevrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<Vec<Vec<u8>>>;
fn zrevrangebylex_with_scores<K: AsRef<[u8]>>(
&self,
key: K,
spec: &RangeLexSpec,
) -> Result<Vec<ZSetMemberScore>>;
fn zrange_spec<K: AsRef<[u8]>>(
&self,
key: K,
start_or_min: &[u8],
stop_or_max: &[u8],
spec: &ZRangeSpec,
) -> Result<Vec<ZSetMemberScore>>;
fn zpopmin<K: AsRef<[u8]>>(&self, key: K, count: usize) -> Result<Vec<ZSetMemberScore>>;
fn zpopmax<K: AsRef<[u8]>>(&self, key: K, count: usize) -> Result<Vec<ZSetMemberScore>>;
fn bzpopmin<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Option<ZSetKeyMemberScore>>;
fn bzpopmax<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Option<ZSetKeyMemberScore>>;
fn zrandmember<K: AsRef<[u8]>>(&self, key: K, count: i64) -> Result<Vec<ZSetMemberScore>>;
fn zremrangebyrank<K: AsRef<[u8]>>(&self, key: K, start: i64, stop: i64) -> Result<usize>;
fn zremrangebyscore<K: AsRef<[u8]>>(&self, key: K, spec: &RangeScoreSpec) -> Result<usize>;
fn zremrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<usize>;
fn overwrite_zset<K: AsRef<[u8]>, M: AsRef<[u8]>>(
&self,
key: K,
score_members: &[(M, f64)],
) -> Result<usize>;
fn zdiff<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<ZSetMemberScore>>;
fn zdiffstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(&self, dst: D, keys: &[K]) -> Result<usize>;
fn zunion<K: AsRef<[u8]>>(
&self,
keys_weights: &[(K, f64)],
aggregate: Aggregate,
) -> Result<Vec<ZSetMemberScore>>;
fn zunionstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(
&self,
dst: D,
keys_weights: &[(K, f64)],
aggregate: Aggregate,
) -> Result<usize>;
fn zinter<K: AsRef<[u8]>>(
&self,
keys_weights: &[(K, f64)],
aggregate: Aggregate,
) -> Result<Vec<ZSetMemberScore>>;
fn zinterstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(
&self,
dst: D,
keys_weights: &[(K, f64)],
aggregate: Aggregate,
) -> Result<usize>;
fn zintercard<K: AsRef<[u8]>>(&self, keys: &[K], limit: usize) -> Result<usize>;
fn zscan<K: AsRef<[u8]>>(
&self,
key: K,
cursor: u64,
pattern: Option<&[u8]>,
count: Option<usize>,
) -> Result<ZScanResult>;
}