File tree Expand file tree Collapse file tree 2 files changed +72
-0
lines changed Expand file tree Collapse file tree 2 files changed +72
-0
lines changed Original file line number Diff line number Diff line change 1+ use crate :: task:: { Context , Poll } ;
2+ use std:: pin:: Pin ;
3+
4+ use crate :: stream:: Stream ;
5+
6+ #[ doc( hidden) ]
7+ #[ allow( missing_debug_implementations) ]
8+ pub struct Enumerate < S > {
9+ stream : S ,
10+ i : usize ,
11+ }
12+
13+ impl < S > Enumerate < S > {
14+ pin_utils:: unsafe_pinned!( stream: S ) ;
15+ pin_utils:: unsafe_unpinned!( i: usize ) ;
16+
17+ pub ( super ) fn new ( stream : S ) -> Self {
18+ Enumerate { stream, i : 0 }
19+ }
20+ }
21+
22+ impl < S > futures_core:: stream:: Stream for Enumerate < S >
23+ where
24+ S : Stream ,
25+ {
26+ type Item = ( usize , S :: Item ) ;
27+
28+ fn poll_next ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
29+ let next = futures_core:: ready!( self . as_mut( ) . stream( ) . poll_next( cx) ) ;
30+
31+ match next {
32+ Some ( v) => {
33+ let ret = ( self . i , v) ;
34+ * self . as_mut ( ) . i ( ) += 1 ;
35+ Poll :: Ready ( Some ( ret) )
36+ }
37+ None => Poll :: Ready ( None ) ,
38+ }
39+ }
40+ }
Original file line number Diff line number Diff line change 2323
2424mod all;
2525mod any;
26+ mod enumerate;
2627mod filter_map;
2728mod find;
2829mod find_map;
@@ -39,6 +40,7 @@ pub use zip::Zip;
3940
4041use all:: AllFuture ;
4142use any:: AnyFuture ;
43+ use enumerate:: Enumerate ;
4244use filter_map:: FilterMap ;
4345use find:: FindFuture ;
4446use find_map:: FindMapFuture ;
@@ -197,6 +199,36 @@ pub trait Stream {
197199 }
198200 }
199201
202+ /// Creates a stream that gives the current element's count as well as the next value.
203+ ///
204+ /// # Overflow behaviour.
205+ ///
206+ /// This combinator does no guarding against overflows.
207+ ///
208+ /// # Examples
209+ /// ```
210+ /// # fn main() { async_std::task::block_on(async {
211+ /// #
212+ /// use async_std::prelude::*;
213+ /// use std::collections::VecDeque;
214+ ///
215+ /// let s: VecDeque<_> = vec!['a', 'b', 'c'].into_iter().collect();
216+ /// let mut s = s.enumerate();
217+ ///
218+ /// assert_eq!(s.next().await, Some((0, 'a')));
219+ /// assert_eq!(s.next().await, Some((1, 'b')));
220+ /// assert_eq!(s.next().await, Some((2, 'c')));
221+ /// assert_eq!(s.next().await, None);
222+ ///
223+ /// #
224+ /// # }) }
225+ fn enumerate ( self ) -> Enumerate < Self >
226+ where
227+ Self : Sized ,
228+ {
229+ Enumerate :: new ( self )
230+ }
231+
200232 /// Both filters and maps a stream.
201233 ///
202234 /// # Examples
You can’t perform that action at this time.
0 commit comments