pub struct LoroTree { /* private fields */ }
Expand description
LoroTree container. It’s used to model movable trees.
You may use it to model directories, outline or other movable hierarchical data.
Learn more at https://loro.dev/docs/tutorial/tree
Implementations§
Source§impl LoroTree
impl LoroTree
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new container that is detached from the document.
The edits on a detached container will not be persisted. To attach the container to the document, please insert it into an attached container.
Sourcepub fn is_attached(&self) -> bool
pub fn is_attached(&self) -> bool
Whether the container is attached to a document
The edits on a detached container will not be persisted. To attach the container to the document, please insert it into an attached container.
Sourcepub fn create<T: Into<TreeParentId>>(&self, parent: T) -> LoroResult<TreeID>
pub fn create<T: Into<TreeParentId>>(&self, parent: T) -> LoroResult<TreeID>
Create a new tree node and return the TreeID
.
If the parent
is None
, the created node is the root of a tree.
Otherwise, the created node is a child of the parent tree node.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
// create a root
let root = tree.create(None).unwrap();
// create a new child
let child = tree.create(root).unwrap();
Sourcepub fn create_at<T: Into<TreeParentId>>(
&self,
parent: T,
index: usize,
) -> LoroResult<TreeID>
pub fn create_at<T: Into<TreeParentId>>( &self, parent: T, index: usize, ) -> LoroResult<TreeID>
Create a new tree node at the given index and return the TreeID
.
If the parent
is None
, the created node is the root of a tree.
If the index
is greater than the number of children of the parent, error will be returned.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
// enable generate fractional index
tree.enable_fractional_index(0);
// create a root
let root = tree.create(None).unwrap();
// create a new child at index 0
let child = tree.create_at(root, 0).unwrap();
Sourcepub fn mov<T: Into<TreeParentId>>(
&self,
target: TreeID,
parent: T,
) -> LoroResult<()>
pub fn mov<T: Into<TreeParentId>>( &self, target: TreeID, parent: T, ) -> LoroResult<()>
Move the target
node to be a child of the parent
node.
If the parent
is None
, the target
node will be a root.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
let root = tree.create(None).unwrap();
let root2 = tree.create(None).unwrap();
// move `root2` to be a child of `root`.
tree.mov(root2, root).unwrap();
Sourcepub fn mov_to<T: Into<TreeParentId>>(
&self,
target: TreeID,
parent: T,
to: usize,
) -> LoroResult<()>
pub fn mov_to<T: Into<TreeParentId>>( &self, target: TreeID, parent: T, to: usize, ) -> LoroResult<()>
Move the target
node to be a child of the parent
node at the given index.
If the parent
is None
, the target
node will be a root.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
// enable generate fractional index
tree.enable_fractional_index(0);
let root = tree.create(None).unwrap();
let root2 = tree.create(None).unwrap();
// move `root2` to be a child of `root` at index 0.
tree.mov_to(root2, root, 0).unwrap();
Sourcepub fn mov_after(&self, target: TreeID, after: TreeID) -> LoroResult<()>
pub fn mov_after(&self, target: TreeID, after: TreeID) -> LoroResult<()>
Move the target
node to be a child after the after
node with the same parent.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
// enable generate fractional index
tree.enable_fractional_index(0);
let root = tree.create(None).unwrap();
let root2 = tree.create(None).unwrap();
// move `root` to be a child after `root2`.
tree.mov_after(root, root2).unwrap();
Sourcepub fn mov_before(&self, target: TreeID, before: TreeID) -> LoroResult<()>
pub fn mov_before(&self, target: TreeID, before: TreeID) -> LoroResult<()>
Move the target
node to be a child before the before
node with the same parent.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
// enable generate fractional index
tree.enable_fractional_index(0);
let root = tree.create(None).unwrap();
let root2 = tree.create(None).unwrap();
// move `root` to be a child before `root2`.
tree.mov_before(root, root2).unwrap();
Sourcepub fn delete(&self, target: TreeID) -> LoroResult<()>
pub fn delete(&self, target: TreeID) -> LoroResult<()>
Delete a tree node.
Note: If the deleted node has children, the children do not appear in the state rather than actually being deleted.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
let root = tree.create(None).unwrap();
tree.delete(root).unwrap();
Sourcepub fn get_meta(&self, target: TreeID) -> LoroResult<LoroMap>
pub fn get_meta(&self, target: TreeID) -> LoroResult<LoroMap>
Get the associated metadata map handler of a tree node.
§Example
use loro::LoroDoc;
let doc = LoroDoc::new();
let tree = doc.get_tree("tree");
let root = tree.create(None).unwrap();
let root_meta = tree.get_meta(root).unwrap();
root_meta.insert("color", "red");
Sourcepub fn parent(&self, target: TreeID) -> Option<TreeParentId>
pub fn parent(&self, target: TreeID) -> Option<TreeParentId>
Return the parent of target node.
- If the target node does not exist, return
None
. - If the target node is a root node, return
Some(None)
.
Sourcepub fn contains(&self, target: TreeID) -> bool
pub fn contains(&self, target: TreeID) -> bool
Return whether target node exists. including deleted node.
Sourcepub fn is_node_deleted(&self, target: &TreeID) -> LoroResult<bool>
pub fn is_node_deleted(&self, target: &TreeID) -> LoroResult<bool>
Return whether target node is deleted.
§Errors
- If the target node does not exist, return
LoroTreeError::TreeNodeNotExist
.
Sourcepub fn get_nodes(&self, with_deleted: bool) -> Vec<TreeNode>
pub fn get_nodes(&self, with_deleted: bool) -> Vec<TreeNode>
Return all nodes, if with_deleted
is true, the deleted nodes will be included.
Sourcepub fn children<T: Into<TreeParentId>>(&self, parent: T) -> Option<Vec<TreeID>>
pub fn children<T: Into<TreeParentId>>(&self, parent: T) -> Option<Vec<TreeID>>
Return all children of the target node.
If the parent node does not exist, return None
.
Sourcepub fn children_num<T: Into<TreeParentId>>(&self, parent: T) -> Option<usize>
pub fn children_num<T: Into<TreeParentId>>(&self, parent: T) -> Option<usize>
Return the number of children of the target node.
Sourcepub fn fractional_index(&self, target: TreeID) -> Option<String>
pub fn fractional_index(&self, target: TreeID) -> Option<String>
Return the fractional index of the target node with hex format.
Sourcepub fn get_value(&self) -> LoroValue
pub fn get_value(&self) -> LoroValue
Return the hierarchy array of the forest.
Note: the metadata will be not resolved. So if you don’t only care about hierarchy but also the metadata, you should use [TreeHandler::get_value_with_meta()].
Sourcepub fn get_value_with_meta(&self) -> LoroValue
pub fn get_value_with_meta(&self) -> LoroValue
Return the hierarchy array of the forest, each node is with metadata.
Sourcepub fn is_fractional_index_enabled(&self) -> bool
pub fn is_fractional_index_enabled(&self) -> bool
Whether the fractional index is enabled.
Sourcepub fn enable_fractional_index(&self, jitter: u8)
pub fn enable_fractional_index(&self, jitter: u8)
Enable fractional index for Tree Position.
The jitter is used to avoid conflicts when multiple users are creating the node at the same position. value 0 is default, which means no jitter, any value larger than 0 will enable jitter.
Generally speaking, jitter will affect the growth rate of document size. Read more about it
Sourcepub fn disable_fractional_index(&self)
pub fn disable_fractional_index(&self)
Disable the fractional index generation when you don’t need the Tree’s siblings to be sorted. The fractional index will always be set to the same default value 0.
After calling this, you cannot use tree.moveTo()
, tree.moveBefore()
, tree.moveAfter()
,
and tree.createAt()
.
Sourcepub fn get_last_move_id(&self, target: &TreeID) -> Option<ID>
pub fn get_last_move_id(&self, target: &TreeID) -> Option<ID>
Get the last move id of the target node.
Trait Implementations§
Source§impl ContainerTrait for LoroTree
impl ContainerTrait for LoroTree
Source§type Handler = TreeHandler
type Handler = TreeHandler
Source§fn id(&self) -> ContainerID
fn id(&self) -> ContainerID
Source§fn to_container(&self) -> Container
fn to_container(&self) -> Container
Source§fn to_handler(&self) -> Self::Handler
fn to_handler(&self) -> Self::Handler
Source§fn from_handler(handler: Self::Handler) -> Self
fn from_handler(handler: Self::Handler) -> Self
Source§fn is_attached(&self) -> bool
fn is_attached(&self) -> bool
Source§fn get_attached(&self) -> Option<Self>
fn get_attached(&self) -> Option<Self>
Source§fn try_from_container(container: Container) -> Option<Self>
fn try_from_container(container: Container) -> Option<Self>
Source§fn is_deleted(&self) -> bool
fn is_deleted(&self) -> bool
Source§fn subscribe(&self, callback: Subscriber) -> Option<Subscription>
fn subscribe(&self, callback: Subscriber) -> Option<Subscription>
Auto Trait Implementations§
impl Freeze for LoroTree
impl RefUnwindSafe for LoroTree
impl Send for LoroTree
impl Sync for LoroTree
impl Unpin for LoroTree
impl UnwindSafe for LoroTree
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);