use std::{borrow::Borrow, hash::Hash, ops::RangeBounds, sync::Arc};
mod arc_m;
pub use arc_m::ArcM;
#[cfg(feature = "impl")]
pub mod score_member;
#[cfg(feature = "impl")]
pub mod zset_impl;
#[cfg(feature = "impl")]
pub use zset_impl::Zset;
pub trait Score: Ord + Clone {}
impl<T: Ord + Clone> Score for T {}
pub trait Key: Eq + Hash + Ord + Clone {}
impl<T: Eq + Hash + Ord + Clone> Key for T {}
pub trait Member<K: Key>: Borrow<K> {}
impl<T, K: Key> Member<K> for T where T: Borrow<K> {}
pub trait Api<M, S>
where
M: Borrow<Self::K>,
S: Score,
{
type K: Key;
type Item;
fn add(&self, member: impl Into<Self::Item>, score: S) -> bool;
fn rm(&self, member: impl Borrow<Self::K>) -> bool;
fn rm_range_by_rank(&self, range: impl RangeBounds<usize>) -> usize;
fn score(&self, member: impl Borrow<Self::K>) -> Option<S>;
fn rank(&self, member: impl Borrow<Self::K>) -> Option<usize>;
fn len(&self) -> usize;
#[cfg(feature = "card")]
fn card(&self) -> usize {
self.len()
}
fn is_empty(&self) -> bool;
fn contains(&self, member: impl Borrow<Self::K>) -> bool;
fn range(&self, range: impl RangeBounds<usize>) -> Vec<Arc<M>>;
fn range_with_scores(&self, range: impl RangeBounds<usize>) -> Vec<(Arc<M>, S)>;
fn get(&self, rank: usize) -> Option<Arc<M>>;
fn get_with_score(&self, rank: usize) -> Option<(Arc<M>, S)>;
}