Enum im::vector::FocusMut [−][src]
pub enum FocusMut<'a, A> where
A: 'a, {
// some variants omitted
}
A mutable version of Focus
.
See Focus
for more details.
You can only build one FocusMut
at a time for a vector, effectively
keeping a lock on the vector until you're done with the focus, which relies
on the structure of the vector not changing while it exists.
let mut vec = Vector::from_iter(0..1000); let focus1 = vec.focus_mut(); // Fails here because you already have a focus let focus2 = vec.focus_mut();
On the other hand, you can split that one focus into multiple sub-foci, which is safe because they can't overlap:
let mut vec = Vector::from_iter(0..1000); let focus = vec.focus_mut(); let (left, right) = focus.split_at(500);
These sub-foci also work as a lock on the vector, even if the focus they were created from goes out of scope.
let mut vec = Vector::from_iter(0..1000); let (left, right) = { let focus = vec.focus_mut(); focus.split_at(500) }; // `left` and `right` are still in scope even if `focus` isn't, so we can't // create another focus: let focus2 = vec.focus_mut();
Methods
impl<'a, A> FocusMut<'a, A> where
A: Clone + 'a,
[src]
impl<'a, A> FocusMut<'a, A> where
A: Clone + 'a,
pub fn new(vector: &'a mut Vector<A>) -> Self
[src]
pub fn new(vector: &'a mut Vector<A>) -> Self
Construct a FocusMut
for a Vector
.
pub fn len(&self) -> usize
[src]
pub fn len(&self) -> usize
Get the length of the focused Vector
.
pub fn is_empty(&self) -> bool
[src]
pub fn is_empty(&self) -> bool
Test if the focused Vector
is empty.
pub fn get(&mut self, index: usize) -> Option<&A>
[src]
pub fn get(&mut self, index: usize) -> Option<&A>
Get a reference to the value at a given index.
pub fn get_mut(&mut self, index: usize) -> Option<&mut A>
[src]
pub fn get_mut(&mut self, index: usize) -> Option<&mut A>
Get a mutable reference to the value at a given index.
pub fn index(&mut self, index: usize) -> &A
[src]
pub fn index(&mut self, index: usize) -> &A
Get a reference to the value at a given index.
Panics if the index is out of bounds.
pub fn index_mut(&mut self, index: usize) -> &mut A
[src]
pub fn index_mut(&mut self, index: usize) -> &mut A
Get a mutable reference to the value at a given index.
Panics if the index is out of bounds.
pub fn set(&mut self, index: usize, value: A) -> Option<A>
[src]
pub fn set(&mut self, index: usize, value: A) -> Option<A>
Update the value at a given index.
Returns None
if the index is out of bounds, or the replaced value
otherwise.
pub fn swap(&mut self, a: usize, b: usize)
[src]
pub fn swap(&mut self, a: usize, b: usize)
Swap the values at two given indices.
Panics if either index is out of bounds.
If the indices are equal, this function returns without doing anything.
pub fn pair<F, B>(&mut self, a: usize, b: usize, f: F) -> B where
F: FnMut(&mut A, &mut A) -> B,
[src]
pub fn pair<F, B>(&mut self, a: usize, b: usize, f: F) -> B where
F: FnMut(&mut A, &mut A) -> B,
Lookup two indices simultaneously and run a function over them.
Useful because the borrow checker won't let you have more than one mutable reference into the same data structure at any given time.
Panics if either index is out of bounds, or if they are the same index.
Examples
let mut vec = vector![1, 2, 3, 4, 5]; vec.focus_mut().pair(1, 3, |a, b| *a += *b); assert_eq!(vector![1, 6, 3, 4, 5], vec);
pub fn triplet<F, B>(&mut self, a: usize, b: usize, c: usize, f: F) -> B where
F: FnMut(&mut A, &mut A, &mut A) -> B,
[src]
pub fn triplet<F, B>(&mut self, a: usize, b: usize, c: usize, f: F) -> B where
F: FnMut(&mut A, &mut A, &mut A) -> B,
Lookup three indices simultaneously and run a function over them.
Useful because the borrow checker won't let you have more than one mutable reference into the same data structure at any given time.
Panics if any index is out of bounds, or if any indices are equal.
Examples
let mut vec = vector![1, 2, 3, 4, 5]; vec.focus_mut().triplet(0, 2, 4, |a, b, c| *a += *b + *c); assert_eq!(vector![9, 2, 3, 4, 5], vec);
pub fn chunk_at(&mut self, index: usize) -> (Range<usize>, &mut [A])
[src]
pub fn chunk_at(&mut self, index: usize) -> (Range<usize>, &mut [A])
Get the chunk for the given index.
This gives you a reference to the leaf node that contains the index, along with its start and end indices.
pub fn narrow<R>(self, range: R) -> Self where
R: RangeBounds<usize>,
[src]
pub fn narrow<R>(self, range: R) -> Self where
R: RangeBounds<usize>,
pub fn split_at(self, index: usize) -> (Self, Self)
[src]
pub fn split_at(self, index: usize) -> (Self, Self)
Split the focus into two.
Given an index index
, consume the focus and produce two new foci, the
left onto indices 0..index
, and the right onto indices index..N
where N
is the length of the current focus.
Panics if the index is out of bounds.
This is the moral equivalent of slice::split_at
, in
that it leaves the underlying data structure unchanged, unlike
Vector::split_at
.
Examples
let mut vec = Vector::from_iter(0..1000); { let (left, right) = vec.focus_mut().split_at(500); for ptr in left { *ptr += 100; } for ptr in right { *ptr -= 100; } } let expected = Vector::from_iter(100..600) + Vector::from_iter(400..900); assert_eq!(expected, vec);
Trait Implementations
impl<'a, A> IntoIterator for FocusMut<'a, A> where
A: Clone + 'a,
[src]
impl<'a, A> IntoIterator for FocusMut<'a, A> where
A: Clone + 'a,