Diffstat (limited to 'src/walk/walkers/core/array.rs')
-rw-r--r--src/walk/walkers/core/array.rs52
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)
}
- })
+ }
}
}