use loro_internal::{
container::ContainerID, handler::counter::CounterHandler, HandlerTrait, LoroResult,
};
use crate::{Container, ContainerTrait, LoroDoc, SealedTrait};
#[derive(Debug, Clone)]
pub struct LoroCounter {
pub(crate) handler: CounterHandler,
}
impl Default for LoroCounter {
fn default() -> Self {
Self::new()
}
}
impl LoroCounter {
pub fn new() -> Self {
Self {
handler: CounterHandler::new_detached(),
}
}
pub fn increment(&self, value: f64) -> LoroResult<()> {
self.handler.increment(value)
}
pub fn decrement(&self, value: f64) -> LoroResult<()> {
self.handler.decrement(value)
}
pub fn get_value(&self) -> f64 {
self.handler.get_value().into_double().unwrap()
}
pub fn get(&self) -> f64 {
self.handler.get_value().into_double().unwrap()
}
}
impl SealedTrait for LoroCounter {}
impl ContainerTrait for LoroCounter {
type Handler = CounterHandler;
fn id(&self) -> ContainerID {
self.handler.id()
}
fn to_container(&self) -> Container {
Container::Counter(self.clone())
}
fn to_handler(&self) -> Self::Handler {
self.handler.clone()
}
fn from_handler(handler: Self::Handler) -> Self {
Self { handler }
}
fn is_attached(&self) -> bool {
self.handler.is_attached()
}
fn get_attached(&self) -> Option<Self> {
self.handler.get_attached().map(Self::from_handler)
}
fn try_from_container(container: Container) -> Option<Self> {
container.into_counter().ok()
}
fn is_deleted(&self) -> bool {
self.handler.is_deleted()
}
fn doc(&self) -> Option<LoroDoc> {
self.handler.doc().map(LoroDoc::_new)
}
}