pub struct Entries<'a, T> { /* private fields */ }
Expand description
A view into the elements of a Vec
Implementations§
Source§impl<'a, T> Entries<'a, T>
impl<'a, T> Entries<'a, T>
Sourcepub fn remaining(&mut self) -> &mut [T]
pub fn remaining(&mut self) -> &mut [T]
Get the remaining elements of the view as a mutable slice.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.remaining(), [0, 1, 2]);
e.shift();
assert_eq!(e.remaining(), [1, 2]);
e.shift();
assert_eq!(e.remaining(), [2]);
});
Sourcepub const fn remaining_len(&self) -> usize
pub const fn remaining_len(&self) -> usize
Get the number of elements still present in the view.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.remaining_len(), 3);
e.shift();
assert_eq!(e.remaining_len(), 2);
e.shift();
assert_eq!(e.remaining_len(), 1);
});
Sourcepub const fn len_before(&self) -> usize
pub const fn len_before(&self) -> usize
Get the length of portion of the underlying Vec
before the view.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.len_before(), 0);
e.shift();
assert_eq!(e.len_before(), 1);
e.shift();
assert_eq!(e.len_before(), 2);
});
Sourcepub fn len_after(&self) -> usize
pub fn len_after(&self) -> usize
Get the length of portion of the underlying Vec
after the view.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.len_after(), 0);
e.shift_back();
assert_eq!(e.len_after(), 1);
e.shift_back();
assert_eq!(e.len_after(), 2);
});
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Remove and drop all remaining elements in the view.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2, 3, 4];
v.entries(.., |e| {
e.shift(); // shift `0` out of view
e.shift_back(); // shift `4` out of view
e.clear(); // Drop 1, 2, and 3
});
assert_eq!(v, [0, 4]);
Sourcepub fn front<'b>(&'b mut self) -> Option<Entry<'a, 'b, T>>
pub fn front<'b>(&'b mut self) -> Option<Entry<'a, 'b, T>>
Get an entry for the element at the head of the view.
Returns None
if the view is empty.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
let f = e.front().unwrap();
assert_eq!(*f, 0);
f.shift();
let f = e.front().unwrap();
assert_eq!(*f, 1);
f.shift();
let f = e.front().unwrap();
assert_eq!(*f, 2);
f.shift();
assert!(e.front().is_none());
});
Sourcepub fn back<'b>(&'b mut self) -> Option<Entry<'a, 'b, T>>
pub fn back<'b>(&'b mut self) -> Option<Entry<'a, 'b, T>>
Get an entry for the element at the tail of the view.
Returns None
if the view is empty.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
let b = e.back().unwrap();
assert_eq!(*b, 2);
b.shift();
let b = e.back().unwrap();
assert_eq!(*b, 1);
b.shift();
let b = e.back().unwrap();
assert_eq!(*b, 0);
b.shift();
assert!(e.back().is_none());
});
Sourcepub fn shift(&mut self) -> Option<&'a mut T>
pub fn shift(&mut self) -> Option<&'a mut T>
Shift the head of the view inward by one, returning a mutable reference to the now excluded item.
Returns None
if the view is empty.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.shift(), Some(&mut 0));
assert_eq!(e.shift(), Some(&mut 1));
assert_eq!(e.shift(), Some(&mut 2));
assert_eq!(e.shift(), None);
});
Sourcepub fn shift_back(&mut self) -> Option<&'a mut T>
pub fn shift_back(&mut self) -> Option<&'a mut T>
Shift the tail of the view inward by one, returning a mutable reference to the now excluded item.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.shift_back(), Some(&mut 2));
assert_eq!(e.shift_back(), Some(&mut 1));
assert_eq!(e.shift_back(), Some(&mut 0));
assert_eq!(e.shift_back(), None);
});
Sourcepub fn remove(&mut self) -> Option<T>
pub fn remove(&mut self) -> Option<T>
Remove the item at the head of the view from the underlying Vec
, returning the now
removed item.
Returns None
if the view is empty.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
e.shift();
assert_eq!(e.remove(), Some(1));
});
assert_eq!(v, [0, 2]);
Examples found in repository?
20fn merkle_step<T>(v: &mut Vec<T>, mut join: impl FnMut(T, T) -> T) {
21 v.entries(.., |e| {
22 while let Some(left) = e.remove() {
23 let Some(right) = e.remove() else {
24 // If we can't find a right, just insert the left and stop
25 let Ok(_) = e.try_insert_outside(left) else {
26 unreachable!()
27 };
28 return;
29 };
30
31 // Combine the two items and insert the result
32 let joined = join(left, right);
33 let Ok(_) = e.try_insert_outside(joined) else {
34 unreachable!()
35 };
36 }
37 });
38}
More examples
20fn sparse_merkle_step<T>(v: &mut Vec<T>, mut maybe_join: impl FnMut(T, T) -> (T, Option<T>)) {
21 v.entries(.., |e| {
22 let Some(mut left) = e.remove() else { return };
23
24 while let Some(right) = e.remove() {
25 // Combine the two items and insert the result
26 // If the join succeeded this is the joined item
27 // If the join failed, this is the left item
28 let (joined, failed) = maybe_join(left, right);
29 let Ok(_) = e.try_insert_outside(joined) else {
30 unreachable!()
31 };
32
33 // Try to get the next left item, either from the join-failure or the next entry
34 // Stop if we can't get any more items
35 left = if let Some(next) = failed {
36 next
37 } else if let Some(next) = e.remove() {
38 next
39 } else {
40 return;
41 };
42 }
43
44 // Re-insert any unused left items
45 let Ok(_) = e.try_insert_outside(left) else {
46 unreachable!()
47 };
48 })
49}
Sourcepub fn remove_back(&mut self) -> Option<T>
pub fn remove_back(&mut self) -> Option<T>
Remove the item at the tail of the view from the underlying Vec
, returning the now
removed item.
Returns None
if the view is empty.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
assert_eq!(e.remove_back(), Some(2));
});
assert_eq!(v, [0, 1]);
Sourcepub fn try_insert_inside(&mut self, v: T) -> Result<&mut T, T>
pub fn try_insert_inside(&mut self, v: T) -> Result<&mut T, T>
Try to insert an item into the underlying Vec
, just before the head of the view.
The view is then shifted include the added item.
Returns Err
if the there is no empty space for the insert to occur.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
// Can't insert if you didn't remove
assert_eq!(e.try_insert_inside(5), Err(5));
assert_eq!(e.remove(), Some(0));
assert_eq!(e.remaining(), [1, 2]);
assert_eq!(e.try_insert_inside(5), Ok(&mut 5));
assert_eq!(e.remaining(), [5, 1, 2]);
});
assert_eq!(v, [5, 1, 2]);
Sourcepub fn try_insert_inside_back(&mut self, v: T) -> Result<&mut T, T>
pub fn try_insert_inside_back(&mut self, v: T) -> Result<&mut T, T>
Try to insert an item into the underlying Vec
, just after the tail of the view.
The view is then shifted include the added item.
Returns Err
if the there is no empty space for the insert to occur.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
// Can't insert if you didn't remove
assert_eq!(e.try_insert_inside_back(5), Err(5));
assert_eq!(e.remove_back(), Some(2));
assert_eq!(e.remaining(), [0, 1]);
assert_eq!(e.try_insert_inside_back(5), Ok(&mut 5));
assert_eq!(e.remaining(), [0, 1, 5]);
});
assert_eq!(v, [0, 1, 5]);
Sourcepub fn try_insert_outside(&mut self, v: T) -> Result<&'a mut T, T>
pub fn try_insert_outside(&mut self, v: T) -> Result<&'a mut T, T>
Try to insert an item into the underlying Vec
, just before the head of the view.
Returns Err
if the there is no empty space for the insert to occur.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
// Can't insert if you didn't remove
assert_eq!(e.try_insert_outside(5), Err(5));
assert_eq!(e.remove(), Some(0));
assert_eq!(e.remaining(), [1, 2]);
assert_eq!(e.try_insert_outside(5), Ok(&mut 5));
assert_eq!(e.remaining(), [1, 2]);
});
assert_eq!(v, [5, 1, 2]);
Examples found in repository?
20fn merkle_step<T>(v: &mut Vec<T>, mut join: impl FnMut(T, T) -> T) {
21 v.entries(.., |e| {
22 while let Some(left) = e.remove() {
23 let Some(right) = e.remove() else {
24 // If we can't find a right, just insert the left and stop
25 let Ok(_) = e.try_insert_outside(left) else {
26 unreachable!()
27 };
28 return;
29 };
30
31 // Combine the two items and insert the result
32 let joined = join(left, right);
33 let Ok(_) = e.try_insert_outside(joined) else {
34 unreachable!()
35 };
36 }
37 });
38}
More examples
20fn sparse_merkle_step<T>(v: &mut Vec<T>, mut maybe_join: impl FnMut(T, T) -> (T, Option<T>)) {
21 v.entries(.., |e| {
22 let Some(mut left) = e.remove() else { return };
23
24 while let Some(right) = e.remove() {
25 // Combine the two items and insert the result
26 // If the join succeeded this is the joined item
27 // If the join failed, this is the left item
28 let (joined, failed) = maybe_join(left, right);
29 let Ok(_) = e.try_insert_outside(joined) else {
30 unreachable!()
31 };
32
33 // Try to get the next left item, either from the join-failure or the next entry
34 // Stop if we can't get any more items
35 left = if let Some(next) = failed {
36 next
37 } else if let Some(next) = e.remove() {
38 next
39 } else {
40 return;
41 };
42 }
43
44 // Re-insert any unused left items
45 let Ok(_) = e.try_insert_outside(left) else {
46 unreachable!()
47 };
48 })
49}
Sourcepub fn try_insert_outside_back(&mut self, v: T) -> Result<&'a mut T, T>
pub fn try_insert_outside_back(&mut self, v: T) -> Result<&'a mut T, T>
Try to insert an item into the underlying Vec
, just after the tail of the view.
Returns Err
if the there is no empty space for the insert to occur.
§Examples
use vec_entries::EntriesExt;
let mut v = vec![0, 1, 2];
v.entries(.., |e| {
// Can't insert if you didn't remove
assert_eq!(e.try_insert_outside_back(5), Err(5));
assert_eq!(e.remove_back(), Some(2));
assert_eq!(e.remaining(), [0, 1]);
assert_eq!(e.try_insert_outside_back(5), Ok(&mut 5));
assert_eq!(e.remaining(), [0, 1]);
});
assert_eq!(v, [0, 1, 5]);
Sourcepub fn shift_iter<'b>(&'b mut self) -> ShiftIter<'a, 'b, T> ⓘ
pub fn shift_iter<'b>(&'b mut self) -> ShiftIter<'a, 'b, T> ⓘ
Get an iterator which gives mutable references to entries.
Sourcepub fn remove_iter<'b>(&'b mut self) -> RemoveIter<'a, 'b, T> ⓘ
pub fn remove_iter<'b>(&'b mut self) -> RemoveIter<'a, 'b, T> ⓘ
Get an iterator which removes entries.