use std::sync::Arc;
use loro::{cursor::Side, ContainerTrait, LoroResult, PeerID};
use crate::{
ContainerID, DiffEvent, LoroDoc, LoroValue, LoroValueLike, Subscriber, Subscription,
ValueOrContainer,
};
use super::{Cursor, LoroCounter, LoroList, LoroMap, LoroText, LoroTree};
#[derive(Debug, Clone)]
pub struct LoroMovableList {
pub(crate) inner: loro::LoroMovableList,
}
impl LoroMovableList {
pub fn new() -> Self {
Self {
inner: loro::LoroMovableList::new(),
}
}
pub fn id(&self) -> ContainerID {
self.inner.id().into()
}
pub fn is_attached(&self) -> bool {
self.inner.is_attached()
}
pub fn get_attached(&self) -> Option<Arc<LoroMovableList>> {
self.inner
.get_attached()
.map(|x| Arc::new(LoroMovableList { inner: x }))
}
pub fn insert(&self, pos: u32, v: Arc<dyn LoroValueLike>) -> LoroResult<()> {
self.inner.insert(pos as usize, v.as_loro_value())
}
#[inline]
pub fn delete(&self, pos: u32, len: u32) -> LoroResult<()> {
self.inner.delete(pos as usize, len as usize)
}
#[inline]
pub fn get(&self, index: u32) -> Option<Arc<dyn ValueOrContainer>> {
self.inner
.get(index as usize)
.map(|v| Arc::new(v) as Arc<dyn ValueOrContainer>)
}
pub fn len(&self) -> u32 {
self.inner.len() as u32
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn get_value(&self) -> LoroValue {
self.inner.get_value().into()
}
pub fn get_deep_value(&self) -> LoroValue {
self.inner.get_deep_value().into()
}
#[inline]
pub fn pop(&self) -> LoroResult<Option<Arc<dyn ValueOrContainer>>> {
self.inner
.pop()
.map(|v| v.map(|v| Arc::new(v) as Arc<dyn ValueOrContainer>))
}
#[inline]
pub fn push(&self, v: Arc<dyn LoroValueLike>) -> LoroResult<()> {
self.inner.push(v.as_loro_value())
}
#[inline]
pub fn insert_list_container(
&self,
pos: u32,
child: Arc<LoroList>,
) -> LoroResult<Arc<LoroList>> {
let c = self
.inner
.insert_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroList { inner: c }))
}
#[inline]
pub fn insert_map_container(&self, pos: u32, child: Arc<LoroMap>) -> LoroResult<Arc<LoroMap>> {
let c = self
.inner
.insert_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroMap { inner: c }))
}
#[inline]
pub fn insert_text_container(
&self,
pos: u32,
child: Arc<LoroText>,
) -> LoroResult<Arc<LoroText>> {
let c = self
.inner
.insert_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroText { inner: c }))
}
#[inline]
pub fn insert_tree_container(
&self,
pos: u32,
child: Arc<LoroTree>,
) -> LoroResult<Arc<LoroTree>> {
let c = self
.inner
.insert_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroTree { inner: c }))
}
#[inline]
pub fn insert_movable_list_container(
&self,
pos: u32,
child: Arc<LoroMovableList>,
) -> LoroResult<Arc<LoroMovableList>> {
let c = self
.inner
.insert_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroMovableList { inner: c }))
}
#[inline]
pub fn insert_counter_container(
&self,
pos: u32,
child: Arc<LoroCounter>,
) -> LoroResult<Arc<LoroCounter>> {
let c = self
.inner
.insert_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroCounter { inner: c }))
}
#[inline]
pub fn set_list_container(&self, pos: u32, child: Arc<LoroList>) -> LoroResult<Arc<LoroList>> {
let c = self
.inner
.set_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroList { inner: c }))
}
#[inline]
pub fn set_map_container(&self, pos: u32, child: Arc<LoroMap>) -> LoroResult<Arc<LoroMap>> {
let c = self
.inner
.set_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroMap { inner: c }))
}
#[inline]
pub fn set_text_container(&self, pos: u32, child: Arc<LoroText>) -> LoroResult<Arc<LoroText>> {
let c = self
.inner
.set_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroText { inner: c }))
}
#[inline]
pub fn set_tree_container(&self, pos: u32, child: Arc<LoroTree>) -> LoroResult<Arc<LoroTree>> {
let c = self
.inner
.set_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroTree { inner: c }))
}
#[inline]
pub fn set_movable_list_container(
&self,
pos: u32,
child: Arc<LoroMovableList>,
) -> LoroResult<Arc<LoroMovableList>> {
let c = self
.inner
.set_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroMovableList { inner: c }))
}
#[inline]
pub fn set_counter_container(
&self,
pos: u32,
child: Arc<LoroCounter>,
) -> LoroResult<Arc<LoroCounter>> {
let c = self
.inner
.set_container(pos as usize, child.as_ref().clone().inner)?;
Ok(Arc::new(LoroCounter { inner: c }))
}
pub fn set(&self, pos: u32, value: Arc<dyn LoroValueLike>) -> LoroResult<()> {
self.inner.set(pos as usize, value.as_loro_value())
}
pub fn mov(&self, from: u32, to: u32) -> LoroResult<()> {
self.inner.mov(from as usize, to as usize)
}
pub fn get_cursor(&self, pos: u32, side: Side) -> Option<Arc<Cursor>> {
self.inner
.get_cursor(pos as usize, side)
.map(|v| Arc::new(v.into()))
}
pub fn to_vec(&self) -> Vec<LoroValue> {
self.inner.to_vec().into_iter().map(|v| v.into()).collect()
}
pub fn clear(&self) -> LoroResult<()> {
self.inner.clear()
}
pub fn is_deleted(&self) -> bool {
self.inner.is_deleted()
}
pub fn get_creator_at(&self, index: u32) -> Option<PeerID> {
self.inner.get_creator_at(index as usize)
}
pub fn get_last_mover_at(&self, index: u32) -> Option<PeerID> {
self.inner.get_last_mover_at(index as usize)
}
pub fn get_last_editor_at(&self, index: u32) -> Option<PeerID> {
self.inner.get_last_editor_at(index as usize)
}
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 LoroMovableList {
fn default() -> Self {
Self::new()
}
}