about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Holk <ericholk@microsoft.com>2023-12-08 12:33:14 -0800
committerEric Holk <ericholk@microsoft.com>2023-12-22 11:01:05 -0800
commit8e34391d6a6e924cbea588d7e418b39aaebb6616 (patch)
treeb3bee2f048a1ae056ca45fc12a92c02dcda1ea3d
parent208dd2032b40ec3f1585dca0eacd7b0e542d22f5 (diff)
downloadrust-8e34391d6a6e924cbea588d7e418b39aaebb6616.tar.gz
rust-8e34391d6a6e924cbea588d7e418b39aaebb6616.zip
Add IntoAsyncIterator
-rw-r--r--library/core/src/async_iter/async_iter.rs22
-rw-r--r--library/core/src/async_iter/mod.rs2
-rw-r--r--library/core/tests/async_iter/mod.rs17
-rw-r--r--library/core/tests/lib.rs4
4 files changed, 44 insertions, 1 deletions
diff --git a/library/core/src/async_iter/async_iter.rs b/library/core/src/async_iter/async_iter.rs
index ed9cb5bfea5..9ef74991dbb 100644
--- a/library/core/src/async_iter/async_iter.rs
+++ b/library/core/src/async_iter/async_iter.rs
@@ -135,3 +135,25 @@ impl<T> Poll<Option<T>> {
     #[cfg_attr(not(bootstrap), lang = "AsyncGenFinished")]
     pub const FINISHED: Self = Poll::Ready(None);
 }
+
+/// Convert something into an async iterator
+#[unstable(feature = "async_iterator", issue = "79024")]
+pub trait IntoAsyncIterator {
+    /// The type of the item yielded by the iterator
+    type Item;
+    /// The type of the resulting iterator
+    type IntoAsyncIter: AsyncIterator<Item = Self::Item>;
+
+    /// Converts `self` into an async iterator
+    fn into_async_iter(self) -> Self::IntoAsyncIter;
+}
+
+#[unstable(feature = "async_iterator", issue = "79024")]
+impl<I: AsyncIterator> IntoAsyncIterator for I {
+    type Item = I::Item;
+    type IntoAsyncIter = I;
+
+    fn into_async_iter(self) -> Self::IntoAsyncIter {
+        self
+    }
+}
diff --git a/library/core/src/async_iter/mod.rs b/library/core/src/async_iter/mod.rs
index 0c6f637711b..e1f1c907582 100644
--- a/library/core/src/async_iter/mod.rs
+++ b/library/core/src/async_iter/mod.rs
@@ -124,5 +124,5 @@
 mod async_iter;
 mod from_iter;
 
-pub use async_iter::AsyncIterator;
+pub use async_iter::{AsyncIterator, IntoAsyncIterator};
 pub use from_iter::{from_iter, FromIter};
diff --git a/library/core/tests/async_iter/mod.rs b/library/core/tests/async_iter/mod.rs
new file mode 100644
index 00000000000..0c30bd1dfea
--- /dev/null
+++ b/library/core/tests/async_iter/mod.rs
@@ -0,0 +1,17 @@
+use core::async_iter::{self, AsyncIterator, IntoAsyncIterator};
+use core::pin::pin;
+use core::task::Poll;
+
+#[test]
+fn into_async_iter() {
+    let async_iter = async_iter::from_iter(0..3);
+    let mut async_iter = pin!(async_iter.into_async_iter());
+
+    let waker = core::task::Waker::noop();
+    let mut cx = &mut core::task::Context::from_waker(&waker);
+
+    assert_eq!(async_iter.as_mut().poll_next(&mut cx), Poll::Ready(Some(0)));
+    assert_eq!(async_iter.as_mut().poll_next(&mut cx), Poll::Ready(Some(1)));
+    assert_eq!(async_iter.as_mut().poll_next(&mut cx), Poll::Ready(Some(2)));
+    assert_eq!(async_iter.as_mut().poll_next(&mut cx), Poll::Ready(None));
+}
diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs
index c531117bed5..c651391ff84 100644
--- a/library/core/tests/lib.rs
+++ b/library/core/tests/lib.rs
@@ -4,6 +4,8 @@
 #![feature(array_windows)]
 #![feature(ascii_char)]
 #![feature(ascii_char_variants)]
+#![feature(async_iter_from_iter)]
+#![feature(async_iterator)]
 #![feature(bigint_helper_methods)]
 #![feature(cell_update)]
 #![feature(const_align_offset)]
@@ -55,6 +57,7 @@
 #![feature(maybe_uninit_write_slice)]
 #![feature(maybe_uninit_uninit_array_transpose)]
 #![feature(min_specialization)]
+#![feature(noop_waker)]
 #![feature(numfmt)]
 #![feature(num_midpoint)]
 #![feature(isqrt)]
@@ -126,6 +129,7 @@ mod any;
 mod array;
 mod ascii;
 mod asserting;
+mod async_iter;
 mod atomic;
 mod bool;
 mod cell;