Skip to content

Commit 0bff08a

Browse files
committed
Add stream::skip implementation
1 parent 61e2e6a commit 0bff08a

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

src/stream.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,27 @@ pub fn then<St, F, Fut>(stream: St, f: F) -> impl Stream<Item = St::Item>
188188
})
189189
}
190190

191+
pub fn skip<St>(stream: St, n: u64) -> impl Stream<Item = St::Item>
192+
where St: Stream,
193+
{
194+
let stream = Box::pin(stream);
195+
futures::stream::unfold((stream, n), async move | (mut stream, mut n)| {
196+
while n != 0 {
197+
if let Some(_) = await!(next(&mut stream)) {
198+
n = n - 1;
199+
continue
200+
} else {
201+
return None
202+
}
203+
}
204+
if let Some(item) = await!(next(&mut stream)) {
205+
Some((item, (stream, 0)))
206+
} else {
207+
None
208+
}
209+
})
210+
}
211+
191212
#[cfg(test)]
192213
mod tests {
193214
use futures::executor;
@@ -320,4 +341,12 @@ mod tests {
320341

321342
assert_eq!(vec![4, 5, 6], executor::block_on(collect::<_, Vec<_>>(stream)));
322343
}
344+
345+
#[test]
346+
fn test_skip() {
347+
let stream = iter(1..=10);
348+
let stream = skip(stream, 5);
349+
350+
assert_eq!(vec![6, 7, 8, 9, 10], executor::block_on(collect::<_, Vec<_>>(stream)));
351+
}
323352
}

0 commit comments

Comments
 (0)