pub struct CursorMut<'list, T: Linked<Links<T>> + ?Sized> { /* private fields */ }
Expand description
A cursor over a List
with editing operations.
A CursorMut
is like a mutable Iterator
(and it implements the
Iterator
trait), except that it can freely seek
back and forth, and can safely mutate the list during iteration. This is
because the lifetime of its yielded references is tied to its own lifetime,
instead of that of the underlying underlying list. This means cursors cannot
yield multiple elements at once.
Cursors always rest between two elements in the list, and index in a logically circular way — once a cursor has advanced past the end of the list, advancing it again will “wrap around” to the first element, and seeking past the first element will wrap the cursor around to the end.
To accommodate this, there is a null non-element that yields None
between
the head and tail of the list. This indicates that the cursor has reached
an end of the list.
This type implements the same interface as the
alloc::collections::linked_list::CursorMut
type, and should behave
similarly.
Implementations§
source§impl<'list, T: Linked<Links<T>> + ?Sized> CursorMut<'list, T>
impl<'list, T: Linked<Links<T>> + ?Sized> CursorMut<'list, T>
sourcepub fn index(&self) -> Option<usize>
pub fn index(&self) -> Option<usize>
Returns the index of this cursor’s position in the List
.
This returns None
if the cursor is currently pointing to the
null element.
sourcepub fn remove_current(&mut self) -> Option<T::Handle>
pub fn remove_current(&mut self) -> Option<T::Handle>
Removes the current element from the List
and returns the Handle
owning that element.
If the cursor is currently pointing to an element, that element is
removed and returned, and the cursor is moved to point to the next
element in the List
.
If the cursor is currently pointing to the null element, then no element
is removed and None
is returned.
sourcepub fn remove_first(
&mut self,
predicate: impl FnMut(&T) -> bool,
) -> Option<T::Handle>
pub fn remove_first( &mut self, predicate: impl FnMut(&T) -> bool, ) -> Option<T::Handle>
Find and remove the first element matching the provided predicate
.
This traverses the list from the cursor’s current position and calls
predicate
with each element in the list. If predicate
returns
true
for a given element, that element is removed from the list and
returned, and the traversal ends. If the traversal reaches the end of
the list without finding a match, then no element is returned.
Note that if the cursor is not at the beginning of the list, then any matching elements before the cursor’s position will not be removed.
This method may be called multiple times to remove more than one matching element.
sourcepub fn current(&self) -> Option<Pin<&T>>
pub fn current(&self) -> Option<Pin<&T>>
Borrows the element that the cursor is currently pointing at.
This returns None
if the cursor is currently pointing to the
null element.
sourcepub fn current_mut(&mut self) -> Option<Pin<&mut T>>
pub fn current_mut(&mut self) -> Option<Pin<&mut T>>
Mutably borrows the element that the cursor is currently pointing at.
This returns None
if the cursor is currently pointing to the
null element.
sourcepub fn peek_next_mut(&mut self) -> Option<Pin<&mut T>>
pub fn peek_next_mut(&mut self) -> Option<Pin<&mut T>>
sourcepub fn peek_prev_mut(&mut self) -> Option<Pin<&mut T>>
pub fn peek_prev_mut(&mut self) -> Option<Pin<&mut T>>
sourcepub fn insert_after(&mut self, element: T::Handle)
pub fn insert_after(&mut self, element: T::Handle)
sourcepub fn insert_before(&mut self, element: T::Handle)
pub fn insert_before(&mut self, element: T::Handle)
sourcepub fn split_after(&mut self) -> List<T>
pub fn split_after(&mut self) -> List<T>
Splits the list into two after the current element. This will return a new list consisting of everything after the cursor, with the original list retaining everything before.
If the cursor is pointing at the null element, then the entire contents
of the List
are moved.
sourcepub fn split_before(&mut self) -> List<T>
pub fn split_before(&mut self) -> List<T>
Splits the list into two before the current element. This will return a new list consisting of everything before the cursor, with the original list retaining everything after the cursor.
If the cursor is pointing at the null element, then the entire contents
of the List
are moved.
sourcepub fn splice_after(&mut self, spliced: List<T>)
pub fn splice_after(&mut self, spliced: List<T>)
Inserts all elements from spliced
after the cursor’s current position.
If the cursor is pointing at the null element, then the contents of
spliced
are inserted at the beginning of the List
the cursor points to.
sourcepub fn splice_before(&mut self, spliced: List<T>)
pub fn splice_before(&mut self, spliced: List<T>)
Inserts all elements from spliced
before the cursor’s current position.
If the cursor is pointing at the null element, then the contents of
spliced
are inserted at the end of the List
the cursor points to.
Trait Implementations§
source§impl<'list, T: Linked<Links<T>> + ?Sized> Iterator for CursorMut<'list, T>
impl<'list, T: Linked<Links<T>> + ?Sized> Iterator for CursorMut<'list, T>
source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
A CursorMut
can never return an accurate size_hint
— its lower
bound is always 0 and its upper bound is always None
.
This is because the cursor may be moved around within the list through
methods outside of its Iterator
implementation, and elements may be
added or removed using the cursor. This would make any size_hint
s a
CursorMut
returns inaccurate.
§type Item = Pin<&'list mut T>
type Item = Pin<&'list mut T>
source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk
)N
values. Read more1.0.0 · source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by
)n
elements. Read more1.0.0 · source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
n
th element of the iterator. Read more1.28.0 · source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
source§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse
)separator
between adjacent items of the original iterator. Read more1.0.0 · source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n
elements. Read more1.0.0 · source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n
elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows
)f
for each contiguous window of size N
over
self
and returns an iterator over the outputs of f
. Like slice::windows()
,
the windows during mapping overlap as well. Read more1.0.0 · source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into
)1.0.0 · source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned
)true
precede all those that return false
. Read more1.27.0 · source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce
)1.0.0 · source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find
)1.0.0 · source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.6.0 · source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks
)N
elements of the iterator at a time. Read more1.11.0 · source§fn product<P>(self) -> P
fn product<P>(self) -> P
source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read more1.5.0 · source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd
elements of
this Iterator
with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moresource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read moresource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by
)1.5.0 · source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator
are lexicographically
less than those of another. Read more1.5.0 · source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator
are lexicographically
less or equal to those of another. Read more1.5.0 · source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than those of another. Read more1.5.0 · source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than or equal to those of another. Read more