Diffstat (limited to 'src/build/builders/core/array.rs')
-rw-r--r--src/build/builders/core/array.rs33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/build/builders/core/array.rs b/src/build/builders/core/array.rs
index aca8775..34b8f65 100644
--- a/src/build/builders/core/array.rs
+++ b/src/build/builders/core/array.rs
@@ -4,7 +4,7 @@ use crate::{
any_trait,
protocol::{
visitor::{Sequence, SequenceScope, Status},
- AnyTraitObj, AnyTraitSendObj as _, ControlFlowFor, Effect, SyncEffect,
+ AsObj as _, Yield, Effect, SyncEffect, EffectAnyTrait,
},
AsVisitor, DefaultBuilder,
};
@@ -15,7 +15,7 @@ use crate::protocol::AsyncEffect;
#[cfg(all(feature = "alloc", not(feature = "std")))]
use alloc::boxed::Box;
-impl<'ctx, T, const N: usize, E: Effect<'ctx>> crate::Build<'ctx, E> for [T; N]
+impl<'ctx, T, const N: usize, E: EffectAnyTrait<'ctx>> crate::Build<'ctx, E> for [T; N]
where
T: crate::Build<'ctx, E>,
<T as crate::Build<'ctx, E>>::Builder: DefaultBuilder<'ctx, E>,
@@ -30,15 +30,15 @@ pub enum ArrayError<E> {
Item(usize, E),
}
-pub struct Builder<'ctx, B: crate::Builder<'ctx, E>, const N: usize, E: Effect<'ctx>> {
+pub struct Builder<'ctx, B: crate::Builder<'ctx, E>, const N: usize, E: EffectAnyTrait<'ctx>> {
array: MaybeUninit<[B::Value; N]>,
index: usize,
item_err: Option<(usize, B::Error)>,
_marker: PhantomData<fn() -> E>,
}
-impl<'ctx, B: crate::DefaultBuilder<'ctx, E>, const N: usize, E: Effect<'ctx>> crate::Builder<'ctx, E>
- for Builder<'ctx, B, N, E>
+impl<'ctx, B: crate::DefaultBuilder<'ctx, E>, const N: usize, E: EffectAnyTrait<'ctx>>
+ crate::Builder<'ctx, E> for Builder<'ctx, B, N, E>
where
Self: AsVisitor<'ctx, E>,
{
@@ -46,7 +46,7 @@ where
type Value = [B::Value; N];
- fn build(self) -> Result<Self::Value, Self::Error> {
+ fn build<'a>(self) -> Result<Self::Value, Self::Error> where Self: 'a {
if let Some((index, err)) = self.item_err {
return Err(ArrayError::Item(index, err));
}
@@ -68,21 +68,25 @@ where
_marker: PhantomData,
}
}
+
+ type Effect = SyncEffect;
}
impl<'ctx, B: crate::DefaultBuilder<'ctx, SyncEffect>, const N: usize> AsVisitor<'ctx, SyncEffect>
for Builder<'ctx, B, N, SyncEffect>
+where
+ B: crate::Builder<'ctx, SyncEffect, Effect = SyncEffect>
{
fn as_visitor(&mut self) -> crate::protocol::Visitor<'_, 'ctx, SyncEffect> {
- AnyTraitObj::from_obj(self)
+ self
}
}
// #[cfg(not(feature = "alloc"))]
any_trait! {
- impl['a, 'ctx, B: crate::DefaultBuilder<'ctx, E>, const N: usize, E: Effect<'ctx>] Builder<'ctx, B, N, E> = [
- dyn Sequence<'ctx> + 'a,
- ]
+ impl['a, 'ctx, B: crate::DefaultBuilder<'ctx, E>, const N: usize, E: Effect<'ctx, ControlFlow<(), ()>>] Builder<'ctx, B, N, E> = [
+ dyn Sequence<'ctx, SyncEffect> + 'a,
+ ] where B: crate::Builder<'ctx, E, Effect = SyncEffect>
}
// #[cfg(feature = "alloc")]
@@ -93,11 +97,16 @@ any_trait! {
// ]
// }
-impl<'ctx, B: crate::DefaultBuilder<'ctx, E>, const N: usize, E: Effect<'ctx>> Sequence<'ctx>
+impl<'ctx, B: crate::DefaultBuilder<'ctx, E>, const N: usize, E: EffectAnyTrait<'ctx>> Sequence<'ctx, SyncEffect>
for Builder<'ctx, B, N, E>
+where
+ B: crate::Builder<'ctx, E, Effect = SyncEffect>
{
#[inline]
- fn visit<'a>(&'a mut self, scope: &'a mut dyn SequenceScope<'ctx>) -> ControlFlowFor<'a, 'ctx> where 'ctx: 'a {
+ fn visit<'a>(&'a mut self, scope: &'a mut dyn SequenceScope<'ctx, SyncEffect>) -> Yield<'a, 'ctx, ControlFlow<(), ()>, SyncEffect>
+ where
+ 'ctx: 'a,
+ {
loop {
// Check if the array is full.
if self.index >= N {