diff --git a/doublets/src/data/traits.rs b/doublets/src/data/traits.rs index 2337fbe..37701fd 100644 --- a/doublets/src/data/traits.rs +++ b/doublets/src/data/traits.rs @@ -3,6 +3,7 @@ use bumpalo::Bump; use rayon::prelude::*; use std::{ default::default, + iter, ops::{ControlFlow, Try}, }; @@ -653,18 +654,27 @@ impl + Sized> DoubletsExt for All { self.each_iter([self.constants().any; 3]) } - type ImplIterEach = impl Iterator> + ExactSizeIterator + DoubleEndedIterator; + type ImplIterEach = impl Iterator>; #[cfg_attr(feature = "more-inline", inline)] fn each_iter(&self, query: impl ToQuery) -> Self::ImplIterEach { - let cap = self.count_by(query.to_query()).as_usize(); - + let query = query.to_query(); + + // We still need to collect into a Vec first because the current architecture + // uses callbacks, but this prepares for future generator-based implementation + let cap = self.count_by(&query).as_usize(); let mut vec = Vec::with_capacity(cap); self.each_by(query, &mut |link| { vec.push(link); Flow::Continue }); - vec.into_iter() + + // Use from_coroutine to create an iterator from the collected data + iter::from_coroutine(#[coroutine] move || { + for link in vec { + yield link; + } + }) } #[cfg(feature = "small-search")] @@ -677,22 +687,28 @@ impl + Sized> DoubletsExt for All { } #[cfg(feature = "small-search")] - type ImplIterEachSmall = - impl Iterator> + ExactSizeIterator + DoubleEndedIterator; + type ImplIterEachSmall = impl Iterator>; #[cfg(feature = "small-search")] #[cfg_attr(feature = "more-inline", inline)] fn each_iter_small(&self, query: impl ToQuery) -> Self::ImplIterEachSmall { // fixme: later use const generics const SIZE_HINT: usize = 2; - + + let query = query.to_query(); let mut vec = smallvec::SmallVec::<[Link<_>; SIZE_HINT]>::with_capacity( - self.count_by(query.to_query()).as_usize(), + self.count_by(&query).as_usize(), ); self.each_by(query, |link| { vec.push(link); Flow::Continue }); - vec.into_iter() + + // Use from_coroutine to create an iterator from the collected data + iter::from_coroutine(#[coroutine] move || { + for link in vec { + yield link; + } + }) } } diff --git a/doublets/src/lib.rs b/doublets/src/lib.rs index beee7bf..8cab522 100644 --- a/doublets/src/lib.rs +++ b/doublets/src/lib.rs @@ -1,5 +1,7 @@ #![feature(fn_traits)] -#![feature(generators)] +#![feature(coroutines)] +#![feature(yield_expr)] +#![feature(iter_from_coroutine)] #![feature(try_trait_v2)] #![feature(default_free_fn)] #![feature(unboxed_closures)]