File tree 2 files changed +82
-0
lines changed
2 files changed +82
-0
lines changed Original file line number Diff line number Diff line change @@ -44,6 +44,7 @@ mod min_by;
44
44
mod next;
45
45
mod nth;
46
46
mod partial_cmp;
47
+ mod peekable;
47
48
mod scan;
48
49
mod skip;
49
50
mod skip_while;
@@ -80,6 +81,7 @@ pub use filter::Filter;
80
81
pub use fuse:: Fuse ;
81
82
pub use inspect:: Inspect ;
82
83
pub use map:: Map ;
84
+ pub use peekable:: Peekable ;
83
85
pub use scan:: Scan ;
84
86
pub use skip:: Skip ;
85
87
pub use skip_while:: SkipWhile ;
@@ -984,6 +986,37 @@ extension_trait! {
984
986
}
985
987
}
986
988
989
+ #[ doc = r#"
990
+ ## Examples
991
+
992
+ ```
993
+ # fn main() { async_std::task::block_on(async {
994
+ #
995
+ use std::collections::VecDeque;
996
+
997
+ use async_std::prelude::*;
998
+
999
+ let s: VecDeque<usize> = vec![1, 2, 3].into_iter().collect();
1000
+ let mut s = s.peekable();
1001
+
1002
+ assert_eq!(s.next().await, Some(1));
1003
+ assert_eq!(s.peek().await, Some(1));
1004
+ assert_eq!(s.next().await, Some(2));
1005
+ assert_eq!(s.next().await, Some(3));
1006
+ assert_eq!(s.next().await, None);
1007
+ #
1008
+ # }) }
1009
+ ```
1010
+ "# ]
1011
+ #[ inline]
1012
+ fn peekable( self ) -> Peekable <Self >
1013
+ where
1014
+ Self : Sized ,
1015
+ {
1016
+ Peekable :: new( self )
1017
+ }
1018
+
1019
+
987
1020
#[ doc = r#"
988
1021
A stream adaptor similar to [`fold`] that holds internal state and produces a new
989
1022
stream.
Original file line number Diff line number Diff line change
1
+ use std:: pin:: Pin ;
2
+
3
+ use crate :: stream:: Stream ;
4
+ use crate :: task:: { Context , Poll } ;
5
+
6
+ #[ doc( hidden) ]
7
+ #[ allow( missing_debug_implementations) ]
8
+ pub struct Peekable < S : Stream > {
9
+ stream : S ,
10
+ peeked : Option < Option < S :: Item > > ,
11
+ }
12
+
13
+
14
+ impl < S > Peekable < S >
15
+ where
16
+ S : Stream ,
17
+ {
18
+ pin_utils:: unsafe_pinned!( stream: S ) ;
19
+ pin_utils:: unsafe_unpinned!( peeked: Option <Option <S :: Item >>) ;
20
+
21
+ pub ( crate ) fn new ( stream : S ) -> Self {
22
+ Peekable {
23
+ stream : stream,
24
+ peeked : None ,
25
+ }
26
+ }
27
+
28
+ pub fn peek ( & mut self ) -> Poll < Option < & S :: Item > > {
29
+ Poll :: Ready ( None )
30
+ }
31
+
32
+ }
33
+
34
+ impl < S > Stream for Peekable < S >
35
+ where
36
+ S : Stream ,
37
+ {
38
+ type Item = S :: Item ;
39
+
40
+ fn poll_next ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
41
+ match & self . peeked {
42
+ Some ( _) => Poll :: Ready ( self . as_mut ( ) . peeked ( ) . take ( ) . unwrap ( ) ) ,
43
+ None => {
44
+ let next = futures_core:: ready!( self . as_mut( ) . stream( ) . poll_next( cx) ) ;
45
+ Poll :: Ready ( next)
46
+ }
47
+ }
48
+ }
49
+ }
You can’t perform that action at this time.
0 commit comments