mirror of
https://github.com/loro-dev/loro.git
synced 2025-02-02 02:59:51 +00:00
feat: add clear methods (#478)
* feat: add clear method * feat: expose clear fn to wasm and rust
This commit is contained in:
parent
66047f7909
commit
cec99f8f7e
3 changed files with 95 additions and 3 deletions
|
@ -11,7 +11,7 @@ use crate::{
|
||||||
diff::{myers_diff, OperateProxy},
|
diff::{myers_diff, OperateProxy},
|
||||||
event::{Diff, TextDiffItem},
|
event::{Diff, TextDiffItem},
|
||||||
op::ListSlice,
|
op::ListSlice,
|
||||||
state::{ContainerState, IndexType, State, TreeParentId},
|
state::{IndexType, State, TreeParentId},
|
||||||
txn::EventHint,
|
txn::EventHint,
|
||||||
utils::{string_slice::StringSlice, utf16::count_utf16_len},
|
utils::{string_slice::StringSlice, utf16::count_utf16_len},
|
||||||
};
|
};
|
||||||
|
@ -777,6 +777,7 @@ impl HandlerTrait for ListHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct UnknownHandler {
|
pub struct UnknownHandler {
|
||||||
inner: BasicHandler,
|
inner: BasicHandler,
|
||||||
|
@ -2690,6 +2691,21 @@ impl ListHandler {
|
||||||
MaybeDetached::Attached(a) => a.is_deleted(),
|
MaybeDetached::Attached(a) => a.is_deleted(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clear(&self) -> LoroResult<()> {
|
||||||
|
match &self.inner {
|
||||||
|
MaybeDetached::Detached(l) => {
|
||||||
|
let mut l = l.try_lock().unwrap();
|
||||||
|
l.value.clear();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
MaybeDetached::Attached(a) => a.with_txn(|txn| self.clear_with_txn(txn)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_with_txn(&self, txn: &mut Transaction) -> LoroResult<()> {
|
||||||
|
self.delete_with_txn(txn, 0, self.len())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MovableListHandler {
|
impl MovableListHandler {
|
||||||
|
@ -3207,8 +3223,8 @@ impl MovableListHandler {
|
||||||
let a = state.as_movable_list_state().unwrap();
|
let a = state.as_movable_list_state().unwrap();
|
||||||
match a.get(index, IndexType::ForUser) {
|
match a.get(index, IndexType::ForUser) {
|
||||||
Some(v) => {
|
Some(v) => {
|
||||||
if let LoroValue::Container(id) = v {
|
if let LoroValue::Container(c) = v {
|
||||||
Some(ValueOrHandler::Handler(create_handler(m, id.clone())))
|
Some(ValueOrHandler::Handler(create_handler(m, c.clone())))
|
||||||
} else {
|
} else {
|
||||||
Some(ValueOrHandler::Value(v.clone()))
|
Some(ValueOrHandler::Value(v.clone()))
|
||||||
}
|
}
|
||||||
|
@ -3329,6 +3345,21 @@ impl MovableListHandler {
|
||||||
MaybeDetached::Attached(a) => a.is_deleted(),
|
MaybeDetached::Attached(a) => a.is_deleted(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clear(&self) -> LoroResult<()> {
|
||||||
|
match &self.inner {
|
||||||
|
MaybeDetached::Detached(d) => {
|
||||||
|
let mut d = d.lock().unwrap();
|
||||||
|
d.value.clear();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
MaybeDetached::Attached(a) => a.with_txn(|txn| self.clear_with_txn(txn)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_with_txn(&self, txn: &mut Transaction) -> LoroResult<()> {
|
||||||
|
self.delete_with_txn(txn, 0, self.len())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MapHandler {
|
impl MapHandler {
|
||||||
|
@ -3638,6 +3669,34 @@ impl MapHandler {
|
||||||
MaybeDetached::Attached(a) => a.is_deleted(),
|
MaybeDetached::Attached(a) => a.is_deleted(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clear(&self) -> LoroResult<()> {
|
||||||
|
match &self.inner {
|
||||||
|
MaybeDetached::Detached(m) => {
|
||||||
|
let mut m = m.try_lock().unwrap();
|
||||||
|
m.value.clear();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
MaybeDetached::Attached(a) => a.with_txn(|txn| self.clear_with_txn(txn)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_with_txn(&self, txn: &mut Transaction) -> LoroResult<()> {
|
||||||
|
let keys: Vec<InternalString> = self.inner.try_attached_state()?.with_state(|state| {
|
||||||
|
state
|
||||||
|
.as_map_state()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.map(|(k, _)| k.clone())
|
||||||
|
.collect()
|
||||||
|
});
|
||||||
|
|
||||||
|
for key in keys {
|
||||||
|
self.delete_with_txn(txn, &key)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|
|
@ -2415,6 +2415,12 @@ impl LoroMap {
|
||||||
};
|
};
|
||||||
handler_to_js_value(Handler::Map(h), self.doc.clone()).into()
|
handler_to_js_value(Handler::Map(h), self.doc.clone()).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete all key-value pairs in the map.
|
||||||
|
pub fn clear(&self) -> JsResult<()> {
|
||||||
|
self.handler.clear()?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for LoroMap {
|
impl Default for LoroMap {
|
||||||
|
@ -2743,6 +2749,12 @@ impl LoroList {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete all elements in the list.
|
||||||
|
pub fn clear(&self) -> JsResult<()> {
|
||||||
|
self.handler.clear()?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for LoroList {
|
impl Default for LoroList {
|
||||||
|
@ -3115,6 +3127,12 @@ impl LoroMovableList {
|
||||||
v.into()
|
v.into()
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete all elements in the list.
|
||||||
|
pub fn clear(&self) -> JsResult<()> {
|
||||||
|
self.handler.clear()?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The handler of a tree(forest) container.
|
/// The handler of a tree(forest) container.
|
||||||
|
|
|
@ -1058,6 +1058,11 @@ impl LoroList {
|
||||||
pub fn to_vec(&self) -> Vec<LoroValue> {
|
pub fn to_vec(&self) -> Vec<LoroValue> {
|
||||||
Arc::unwrap_or_clone(self.get_value().into_list().unwrap())
|
Arc::unwrap_or_clone(self.get_value().into_list().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete all elements in the list.
|
||||||
|
pub fn clear(&self) -> LoroResult<()> {
|
||||||
|
self.handler.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for LoroList {
|
impl Default for LoroList {
|
||||||
|
@ -1229,6 +1234,11 @@ impl LoroMap {
|
||||||
.get_or_create_container(key, child.to_handler())?,
|
.get_or_create_container(key, child.to_handler())?,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete all key-value pairs in the map.
|
||||||
|
pub fn clear(&self) -> LoroResult<()> {
|
||||||
|
self.handler.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for LoroMap {
|
impl Default for LoroMap {
|
||||||
|
@ -2102,6 +2112,11 @@ impl LoroMovableList {
|
||||||
pub fn to_vec(&self) -> Vec<LoroValue> {
|
pub fn to_vec(&self) -> Vec<LoroValue> {
|
||||||
Arc::unwrap_or_clone(self.get_value().into_list().unwrap())
|
Arc::unwrap_or_clone(self.get_value().into_list().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete all elements in the list.
|
||||||
|
pub fn clear(&self) -> LoroResult<()> {
|
||||||
|
self.handler.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for LoroMovableList {
|
impl Default for LoroMovableList {
|
||||||
|
|
Loading…
Reference in a new issue