Diffstat (limited to 'src/walk/walkers/core/int.rs')
| -rw-r--r-- | src/walk/walkers/core/int.rs | 261 |
1 files changed, 139 insertions, 122 deletions
diff --git a/src/walk/walkers/core/int.rs b/src/walk/walkers/core/int.rs index 2df49ea..bef10d8 100644 --- a/src/walk/walkers/core/int.rs +++ b/src/walk/walkers/core/int.rs @@ -1,5 +1,7 @@ +use effectful::effective::Effective; use effectful::environment::{DynBind, Environment, NativeForm}; use effectful::forward_send_sync; +use effectful::higher_ranked::Mut; use crate::{ any::OwnedStatic, @@ -78,9 +80,9 @@ impl<T: Integer> ::core::fmt::Display for IntegerWalkerError<T> { } } -impl<'ctx, T: Integer, E: Environment> Walker<'ctx, E> for IntegerWalker<T, E> +impl<'ctx, T: Integer, E: Environment> Walker<'ctx, E> for IntegerWalker<T, E> where - T: DynBind<E> + T: DynBind<E>, { type Error = IntegerWalkerError<T>; @@ -95,124 +97,138 @@ where { let value = self.value; - E::as_ctx((self, visitor), move |(this, visitor)| { - request_hint::<E>(visitor.cast(), DynWalker(this)) - .map(VisitResult::unit_skipped) - .cast() - }) - .map(|((_, visitor), result)| (visitor, result)) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, i8>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) + E::value((self, visitor)) + .update((), |_, (this, visitor)| { + request_hint::<E>(visitor.cast(), DynWalker(this)) + .map((), |_, x| VisitResult::unit_skipped(x)) .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, u8>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, i16>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, u16>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, i32>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, u32>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, i64>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, u64>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, i128>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, u128>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, isize>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .if_skipped(move |visitor| { - if let Some(value) = try_into::<_, usize>(value) { - visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) - .cast() - } else { - E::ready(VisitResult::Skipped(())).cast() - } - }) - .map(move |(_, result)| match result { - VisitResult::Skipped(()) => Err(IntegerWalkerError { value }), - VisitResult::Control(_) => Ok(value), - }) + }) + .map((), |_, ((_, visitor), result)| (visitor, result)) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, i8>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, u8>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, i16>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, u16>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, i32>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, u32>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, i64>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, u64>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, i128>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, u128>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, isize>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .cast::<()>() + .if_skipped(value, |value, visitor| { + if let Some(value) = try_into::<_, usize>(value) { + visit_value::<_, E>(visitor.cast(), OwnedStatic(value)) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() + } else { + E::value(VisitResult::Skipped(())).cast() + } + }) + .map(value, |value, (_, result)| match result { + VisitResult::Skipped(()) => Err(IntegerWalkerError { value }), + VisitResult::Control(_) => Ok(value), + }) + .cast() } } @@ -270,9 +286,10 @@ macro_rules! impl_hints { { if let Some(value) = try_into::<_, $type>(self.value) { visit_value::<_, E>(visitor.into_inner(), OwnedStatic(value)) - .map(VisitResult::unit_skipped) + .map((), |_, x| VisitResult::unit_skipped(x)) + .cast() } else { - E::ready(VisitResult::Skipped(())) + E::value(VisitResult::Skipped(())).cast() } } @@ -281,7 +298,7 @@ macro_rules! impl_hints { _hint: &'a MetaHint<'a, 'ctx, ValueProto<OwnedStatic<$type>, E>>, ) -> NativeForm<'a, Result<MetaKnown<'a, 'ctx, ValueProto<OwnedStatic<$type>, E>>, ()>, E> { - E::ready(Ok(ValueKnown { preview: None })) + E::value(Ok(ValueKnown { preview: None })).cast() } })* }; |