Struct matrix_sdk_common::linked_chunk::LinkedChunk
source · pub struct LinkedChunk<const CHUNK_CAPACITY: usize, Item, Gap> { /* private fields */ }
Expand description
The LinkedChunk
structure.
It is similar to a linked list, except that it contains many items Item
instead of a single one. A chunk has a maximum capacity of CHUNK_CAPACITY
.
Once a chunk is full, a new chunk is created. Not all chunks are necessarily
entirely full. A chunk can represents a Gap
between other chunks.
Implementations§
source§impl<const CAP: usize, Item, Gap> LinkedChunk<CAP, Item, Gap>
impl<const CAP: usize, Item, Gap> LinkedChunk<CAP, Item, Gap>
sourcepub fn new_with_update_history() -> Self
pub fn new_with_update_history() -> Self
Create a new Self
with a history of updates.
When Self
is built with update history, the
[ObservableUpdates::take
] method must be called to consume and
clean the updates. See Self::updates
.
sourcepub fn push_items_back<I>(&mut self, items: I)
pub fn push_items_back<I>(&mut self, items: I)
Push items at the end of the LinkedChunk
, i.e. on the last
chunk.
If the last chunk doesn’t have enough space to welcome all items
,
then new chunks can be created (and linked appropriately).
sourcepub fn push_gap_back(&mut self, content: Gap)
pub fn push_gap_back(&mut self, content: Gap)
Push a gap at the end of the LinkedChunk
, i.e. after the last
chunk.
sourcepub fn insert_items_at<I>(
&mut self,
items: I,
position: Position,
) -> Result<(), Error>
pub fn insert_items_at<I>( &mut self, items: I, position: Position, ) -> Result<(), Error>
Insert items at a specified position in the LinkedChunk
.
Because the position
can be invalid, this method returns a
Result
.
sourcepub fn remove_item_at(
&mut self,
position: Position,
empty_chunk: EmptyChunk,
) -> Result<Item, Error>
pub fn remove_item_at( &mut self, position: Position, empty_chunk: EmptyChunk, ) -> Result<Item, Error>
Remove item at a specified position in the LinkedChunk
.
position
must point to a valid item, otherwise the method returns
Err
.
The chunk containing the item represented by position
may be empty
once the item has been removed. In this case, the chunk can be removed
if empty_chunk
contains EmptyChunk::Remove
, otherwise the chunk is
kept if empty_chunk
contains EmptyChunk::Keep
.
sourcepub fn insert_gap_at(
&mut self,
content: Gap,
position: Position,
) -> Result<(), Error>
pub fn insert_gap_at( &mut self, content: Gap, position: Position, ) -> Result<(), Error>
Insert a gap at a specified position in the LinkedChunk
.
Because the position
can be invalid, this method returns a
Result
.
sourcepub fn replace_gap_at<I>(
&mut self,
items: I,
chunk_identifier: ChunkIdentifier,
) -> Result<&Chunk<CAP, Item, Gap>, Error>
pub fn replace_gap_at<I>( &mut self, items: I, chunk_identifier: ChunkIdentifier, ) -> Result<&Chunk<CAP, Item, Gap>, Error>
Replace the gap identified by chunk_identifier
, by items.
Because the chunk_identifier
can represent non-gap chunk, this method
returns a Result
.
This method returns a reference to the (first if many) newly created
Chunk
that contains the items
.
sourcepub fn chunk_identifier<'a, P>(
&'a self,
predicate: P,
) -> Option<ChunkIdentifier>
pub fn chunk_identifier<'a, P>( &'a self, predicate: P, ) -> Option<ChunkIdentifier>
Search backwards for a chunk, and return its identifier.
sourcepub fn item_position<'a, P>(&'a self, predicate: P) -> Option<Position>
pub fn item_position<'a, P>(&'a self, predicate: P) -> Option<Position>
Search backwards for an item, and return its position.
sourcepub fn rchunks(&self) -> IterBackward<'_, CAP, Item, Gap> ⓘ
pub fn rchunks(&self) -> IterBackward<'_, CAP, Item, Gap> ⓘ
Iterate over the chunks, backwards.
It iterates from the last to the first chunk.
sourcepub fn chunks(&self) -> Iter<'_, CAP, Item, Gap> ⓘ
pub fn chunks(&self) -> Iter<'_, CAP, Item, Gap> ⓘ
Iterate over the chunks, forward.
It iterates from the first to the last chunk.
sourcepub fn rchunks_from(
&self,
identifier: ChunkIdentifier,
) -> Result<IterBackward<'_, CAP, Item, Gap>, Error>
pub fn rchunks_from( &self, identifier: ChunkIdentifier, ) -> Result<IterBackward<'_, CAP, Item, Gap>, Error>
Iterate over the chunks, starting from identifier
, backward.
It iterates from the chunk with the identifier identifier
to the first
chunk.
sourcepub fn chunks_from(
&self,
identifier: ChunkIdentifier,
) -> Result<Iter<'_, CAP, Item, Gap>, Error>
pub fn chunks_from( &self, identifier: ChunkIdentifier, ) -> Result<Iter<'_, CAP, Item, Gap>, Error>
Iterate over the chunks, starting from position
, forward.
It iterates from the chunk with the identifier identifier
to the last
chunk.
sourcepub fn ritems(&self) -> impl Iterator<Item = (Position, &Item)>
pub fn ritems(&self) -> impl Iterator<Item = (Position, &Item)>
Iterate over the items, backward.
It iterates from the last to the first item.
sourcepub fn items(&self) -> impl Iterator<Item = (Position, &Item)>
pub fn items(&self) -> impl Iterator<Item = (Position, &Item)>
Iterate over the items, forward.
It iterates from the first to the last item.
sourcepub fn ritems_from(
&self,
position: Position,
) -> Result<impl Iterator<Item = (Position, &Item)>, Error>
pub fn ritems_from( &self, position: Position, ) -> Result<impl Iterator<Item = (Position, &Item)>, Error>
Iterate over the items, starting from position
, backward.
It iterates from the item at position
to the first item.
sourcepub fn items_from(
&self,
position: Position,
) -> Result<impl Iterator<Item = (Position, &Item)>, Error>
pub fn items_from( &self, position: Position, ) -> Result<impl Iterator<Item = (Position, &Item)>, Error>
Iterate over the items, starting from position
, forward.
It iterates from the item at position
to the last item.
sourcepub fn updates(&mut self) -> Option<&mut ObservableUpdates<Item, Gap>>
pub fn updates(&mut self) -> Option<&mut ObservableUpdates<Item, Gap>>
Get a mutable reference to the LinkedChunk
updates, aka
[ObservableUpdates
].
If the Option
becomes None
, it will disable update history. Thus, be
careful when you want to empty the update history: do not use
Option::take()
directly but rather [ObservableUpdates::take
] for
example.
It returns None
if updates are disabled, i.e. if this linked chunk has
been constructed with Self::new
, otherwise, if it’s been constructed
with Self::new_with_update_history
, it returns Some(…)
.
sourcepub fn as_vector(&mut self) -> Option<AsVector<Item, Gap>>
pub fn as_vector(&mut self) -> Option<AsVector<Item, Gap>>
Get updates as eyeball_im::VectorDiff
, see [AsVector
] to learn
more.
It returns None
if updates are disabled, i.e. if this linked chunk has
been constructed with Self::new
, otherwise, if it’s been constructed
with Self::new_with_update_history
, it returns Some(…)
.
Trait Implementations§
source§impl<const CAP: usize, Item, Gap> Debug for LinkedChunk<CAP, Item, Gap>
impl<const CAP: usize, Item, Gap> Debug for LinkedChunk<CAP, Item, Gap>
source§impl<const CAP: usize, Item, Gap> Default for LinkedChunk<CAP, Item, Gap>
impl<const CAP: usize, Item, Gap> Default for LinkedChunk<CAP, Item, Gap>
source§impl<const CAP: usize, Item, Gap> Drop for LinkedChunk<CAP, Item, Gap>
impl<const CAP: usize, Item, Gap> Drop for LinkedChunk<CAP, Item, Gap>
impl<const CAP: usize, Item: Send, Gap: Send> Send for LinkedChunk<CAP, Item, Gap>
A LinkedChunk
can be safely sent over thread boundaries if Item: Send
and Gap: Send
. The only unsafe part if around the NonNull
, but the API
and the lifetimes to deref them are designed safely.
impl<const CAP: usize, Item: Sync, Gap: Sync> Sync for LinkedChunk<CAP, Item, Gap>
A LinkedChunk
can be safely share between threads if Item: Sync
and
Gap: Sync
. The only unsafe part if around the NonNull
, but the API and
the lifetimes to deref them are designed safely.