@@ -55,7 +55,7 @@ extern crate core as std;
5555extern 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
6060pub use either:: Either ;
6161
@@ -72,6 +72,8 @@ use std::fmt::Write;
7272use std:: hash:: Hash ;
7373use std:: iter:: { once, IntoIterator } ;
7474#[ cfg( feature = "use_alloc" ) ]
75+ type VecDequeIntoIter < T > = alloc:: collections:: vec_deque:: IntoIter < T > ;
76+ #[ cfg( feature = "use_alloc" ) ]
7577type VecIntoIter < T > = alloc:: vec:: IntoIter < T > ;
7678use 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