Skip to content

Commit d61185a

Browse files
Itertools::tail with VecDeque rather than Vec
1 parent 740a62a commit d61185a

File tree

1 file changed

+9
-14
lines changed

1 file changed

+9
-14
lines changed

src/lib.rs

+9-14
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern crate core as std;
5555
extern crate alloc;
5656

5757
#[cfg(feature = "use_alloc")]
58-
use alloc::{string::String, vec::Vec};
58+
use alloc::{collections::VecDeque, string::String, vec::Vec};
5959

6060
pub use either::Either;
6161

@@ -72,6 +72,8 @@ use std::fmt::Write;
7272
use std::hash::Hash;
7373
use std::iter::{once, IntoIterator};
7474
#[cfg(feature = "use_alloc")]
75+
type VecDequeIntoIter<T> = alloc::collections::vec_deque::IntoIter<T>;
76+
#[cfg(feature = "use_alloc")]
7577
type VecIntoIter<T> = alloc::vec::IntoIter<T>;
7678
use std::iter::FromIterator;
7779

@@ -3153,32 +3155,25 @@ pub trait Itertools: Iterator {
31533155
/// `.rev().take(n).rev()` to have a similar result (lazy and non-allocating)
31543156
/// without consuming the entire iterator.
31553157
#[cfg(feature = "use_alloc")]
3156-
fn tail(self, n: usize) -> VecIntoIter<Self::Item>
3158+
fn tail(self, n: usize) -> VecDequeIntoIter<Self::Item>
31573159
where
31583160
Self: Sized,
31593161
{
31603162
match n {
31613163
0 => {
31623164
self.last();
3163-
Vec::new()
3165+
VecDeque::new()
31643166
}
31653167
1 => self.last().into_iter().collect(),
31663168
_ => {
31673169
// Skip the starting part of iterator if possible.
31683170
let (low, _) = self.size_hint();
31693171
let mut iter = self.fuse().skip(low.saturating_sub(n));
3170-
let mut data: Vec<_> = iter.by_ref().take(n).collect();
3171-
// Update `data` cyclically.
3172-
let idx = iter.fold(0, |i, val| {
3173-
data[i] = val;
3174-
if i + 1 == n {
3175-
0
3176-
} else {
3177-
i + 1
3178-
}
3172+
let mut data: VecDeque<_> = iter.by_ref().take(n).collect();
3173+
iter.for_each(|value| {
3174+
data.pop_front();
3175+
data.push_back(value);
31793176
});
3180-
// Respect the insertion order.
3181-
data.rotate_left(idx);
31823177
data
31833178
}
31843179
}

0 commit comments

Comments
 (0)