Diffstat (limited to 'src/walk/walkers/core/array.rs')
| -rw-r--r-- | src/walk/walkers/core/array.rs | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/src/walk/walkers/core/array.rs b/src/walk/walkers/core/array.rs index 73777d0..2709135 100644 --- a/src/walk/walkers/core/array.rs +++ b/src/walk/walkers/core/array.rs @@ -10,7 +10,10 @@ use crate::{ }, }; -impl<'ctx, T: crate::Walk<'ctx>, const N: usize> crate::Walk<'ctx> for [T; N] { +impl<'ctx, T: crate::Walk<'ctx>, const N: usize> crate::Walk<'ctx> for [T; N] +where + <T as crate::Walk<'ctx>>::Walker: crate::Walker<'ctx, Effect = SyncEffect> +{ type Walker = Walker<'ctx, T, N, T::Walker>; } @@ -38,7 +41,7 @@ impl<'ctx, T, const N: usize, W: crate::Walker<'ctx> + From<T>> From<[T; N]> } } -impl<'ctx, T, const N: usize, W: crate::Walker<'ctx> + From<T>> crate::Walker<'ctx> +impl<'ctx, T, const N: usize, W: crate::Walker<'ctx, Effect = SyncEffect> + From<T>> crate::Walker<'ctx> for Walker<'ctx, T, N, W> { type Effect = SyncEffect; @@ -52,21 +55,19 @@ impl<'ctx, T, const N: usize, W: crate::Walker<'ctx> + From<T>> crate::Walker<'c mut self, visitor: &'a mut Visitor<'a, 'ctx>, ) -> ControlFlowFor<'a, Self::Effect, Self::Output, Self::Error> { - SyncEffect::wrap(async { - if let Some(object) = visitor.upcast_mut::<dyn Sequence<'ctx, W::Effect> + '_>() { - object.visit(&mut self).await; - } + if let Some(object) = visitor.upcast_mut::<dyn Sequence<'ctx, W::Effect> + '_>() { + object.visit(&mut self); + } - if let Some((index, error)) = self.item_err { - ControlFlow::Break(WalkerError { index, error }) - } else { - ControlFlow::Continue(()) - } - }) + if let Some((index, error)) = self.item_err { + ControlFlow::Break(WalkerError { index, error }) + } else { + ControlFlow::Continue(()) + } } } -impl<'ctx, T, const N: usize, W: crate::Walker<'ctx> + From<T>> SequenceScope<'ctx, W::Effect> +impl<'ctx, T, const N: usize, W: crate::Walker<'ctx, Effect = SyncEffect> + From<T>> SequenceScope<'ctx> for Walker<'ctx, T, N, W> { #[inline] @@ -74,22 +75,21 @@ impl<'ctx, T, const N: usize, W: crate::Walker<'ctx> + From<T>> SequenceScope<'c &'a mut self, visitor: &'a mut Visitor<'a, 'ctx>, ) -> ControlFlowFor<'a, W::Effect, Status> { - W::Effect::wrap(async { - if let Some(Some(value)) = self.array.get_mut(self.index).map(Option::take) { - self.index += 1; + if self.index >= N { + return ControlFlow::Continue(Status::Done); + } - let walker = W::from(value); + let value = unsafe { self.array.get_unchecked_mut(self.index).take().unwrap_unchecked() }; + self.index += 1; - match walker.walk(visitor).await { - ControlFlow::Continue(_) => ControlFlow::Continue(Status::Continue), - ControlFlow::Break(err) => { - self.item_err = Some((self.index, err)); - ControlFlow::Continue(Status::Done) - } - } - } else { + let walker = W::from(value); + + match walker.walk(visitor) { + ControlFlow::Continue(_) => ControlFlow::Continue(Status::Continue), + ControlFlow::Break(err) => { + self.item_err = Some((self.index, err)); ControlFlow::Continue(Status::Done) } - }) + } } } |