Diffstat (limited to 'src/build/builders/core/array.rs')
| -rw-r--r-- | src/build/builders/core/array.rs | 33 |
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 { |