use std::sync::Arc;
use loro::{ContainerTrait, LoroResult};
use crate::{ContainerID, DiffEvent, LoroDoc, Subscriber, Subscription};
#[derive(Debug, Clone)]
pub struct LoroCounter {
pub(crate) inner: loro::LoroCounter,
}
impl LoroCounter {
pub fn new() -> Self {
Self {
inner: loro::LoroCounter::new(),
}
}
pub fn is_attached(&self) -> bool {
self.inner.is_attached()
}
pub fn get_attached(&self) -> Option<Arc<LoroCounter>> {
self.inner
.get_attached()
.map(|x| Arc::new(LoroCounter { inner: x }))
}
pub fn id(&self) -> ContainerID {
self.inner.id().into()
}
pub fn increment(&self, value: f64) -> LoroResult<()> {
self.inner.increment(value)
}
pub fn decrement(&self, value: f64) -> LoroResult<()> {
self.inner.decrement(value)
}
pub fn get_value(&self) -> f64 {
self.inner.get_value()
}
pub fn is_deleted(&self) -> bool {
self.inner.is_deleted()
}
pub fn doc(&self) -> Option<Arc<LoroDoc>> {
self.inner.doc().map(|x| Arc::new(LoroDoc { doc: x }))
}
pub fn subscribe(&self, subscriber: Arc<dyn Subscriber>) -> Option<Arc<Subscription>> {
self.inner
.subscribe(Arc::new(move |e| {
subscriber.on_diff(DiffEvent::from(e));
}))
.map(|x| Arc::new(x.into()))
}
}
impl Default for LoroCounter {
fn default() -> Self {
Self::new()
}
}