Diffstat (limited to 'src/walk/walkers/core/int.rs')
-rw-r--r--src/walk/walkers/core/int.rs261
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()
}
})*
};