zset 0.1.17

High-performance, thread-safe sorted set for Rust, inspired by Redis ZSET. / 高性能、线程安全的 Rust 排序集,灵感源自 Redis ZSET。
Documentation
use std::{borrow::Borrow, marker::PhantomData, ops::Deref, sync::Arc};

use crate::{Key, Member};

#[derive(Debug)]
pub struct ArcM<K: Key, M: Member<K>> {
  pub(crate) inner: Arc<M>,
  _p: PhantomData<K>,
}

impl<K: Key, M: Member<K>> Deref for ArcM<K, M> {
  type Target = M;
  fn deref(&self) -> &M {
    &self.inner
  }
}

impl<K: Key, M: Member<K>> Borrow<K> for ArcM<K, M> {
  fn borrow(&self) -> &K {
    self.inner.as_ref().borrow()
  }
}

impl<K: Key, M: Member<K>> From<Arc<M>> for ArcM<K, M> {
  fn from(inner: Arc<M>) -> Self {
    Self {
      inner,
      _p: PhantomData,
    }
  }
}

impl<K: Key, M: Member<K>> From<M> for ArcM<K, M> {
  fn from(m: M) -> Self {
    Self {
      inner: Arc::new(m),
      _p: PhantomData,
    }
  }
}

impl<K: Key, M: Member<K>> Clone for ArcM<K, M> {
  fn clone(&self) -> Self {
    Self {
      inner: self.inner.clone(),
      _p: PhantomData,
    }
  }
}

impl<K: Key, M: Member<K>> AsRef<M> for ArcM<K, M> {
  fn as_ref(&self) -> &M {
    self.inner.as_ref()
  }
}

impl<K: Key, M: Member<K>> PartialOrd for ArcM<K, M> {
  fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
    Some(self.cmp(other))
  }
}

impl<K: Key, M: Member<K>> Ord for ArcM<K, M> {
  fn cmp(&self, other: &Self) -> std::cmp::Ordering {
    let k1: &K = self.inner.as_ref().borrow();
    let k2: &K = other.as_ref().borrow();
    k1.cmp(k2)
  }
}

impl<K: Key, M: Member<K>> PartialEq for ArcM<K, M> {
  fn eq(&self, other: &Self) -> bool {
    let k1: &K = self.inner.as_ref().borrow();
    let k2: &K = other.as_ref().borrow();
    k1.eq(k2)
  }
}

impl<K: Key, M: Member<K>> Eq for ArcM<K, M> {}