Skip to content

Commit 486f9a9

Browse files
committed
Cycle over a known set of values.
1 parent a096d5e commit 486f9a9

File tree

4 files changed

+66
-39
lines changed

4 files changed

+66
-39
lines changed

src/stream/cycle.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use std::pin::Pin;
2+
3+
use pin_project_lite::pin_project;
4+
5+
use crate::stream::Stream;
6+
use crate::task::{Context, Poll};
7+
8+
pin_project! {
9+
/// A stream that will repeatedly yield the same list of elements
10+
pub struct Cycle<T> {
11+
source: Vec<T>,
12+
index: usize,
13+
len: usize,
14+
}
15+
}
16+
17+
impl<T: Copy> Stream for Cycle<T> {
18+
type Item = T;
19+
20+
fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
21+
let value = self.source[self.index];
22+
23+
let next = self.index + 1;
24+
25+
if next >= self.len {
26+
self.as_mut().index = 0;
27+
} else {
28+
self.as_mut().index = next;
29+
}
30+
31+
Poll::Ready(Some(value))
32+
}
33+
}
34+
35+
/// # Examples
36+
///
37+
/// Basic usage:
38+
///
39+
/// ```
40+
/// # async_std::task::block_on(async {
41+
/// #
42+
/// use async_std::prelude::*;
43+
/// use async_std::stream;
44+
///
45+
/// let mut s = stream::cycle(vec![1,2,3]);
46+
///
47+
/// assert_eq!(s.next().await, Some(1));
48+
/// assert_eq!(s.next().await, Some(2));
49+
/// assert_eq!(s.next().await, Some(3));
50+
/// assert_eq!(s.next().await, Some(1));
51+
/// assert_eq!(s.next().await, Some(2));
52+
/// #
53+
/// # })
54+
/// ```
55+
pub fn cycle<T: Copy>(source: Vec<T>) -> impl Stream<Item = T> {
56+
let len = source.len();
57+
Cycle {
58+
source,
59+
index: 0,
60+
len,
61+
}
62+
}

src/stream/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@
300300
//! [`take`]: trait.Stream.html#method.take
301301
//! [`min`]: trait.Stream.html#method.min
302302
303+
pub use cycle::{cycle, Cycle};
303304
pub use empty::{empty, Empty};
304305
pub use from_fn::{from_fn, FromFn};
305306
pub use from_iter::{from_iter, FromIter};
@@ -312,6 +313,7 @@ pub use stream::{
312313

313314
pub(crate) mod stream;
314315

316+
mod cycle;
315317
mod empty;
316318
mod from_fn;
317319
mod from_iter;

src/stream/stream/cycle.rs

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/stream/stream/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
mod all;
2525
mod any;
2626
mod chain;
27-
mod enumerate;
27+
mod cmp;
2828
mod cycle;
2929
mod copied;
3030
mod cmp;
31+
mod enumerate;
3132
mod eq;
3233
mod filter;
3334
mod filter_map;

0 commit comments

Comments
 (0)