Diffstat (limited to 'src/protocol/visitor/value.rs')
| -rw-r--r-- | src/protocol/visitor/value.rs | 177 |
1 files changed, 7 insertions, 170 deletions
diff --git a/src/protocol/visitor/value.rs b/src/protocol/visitor/value.rs index b2ae696..8e902ab 100644 --- a/src/protocol/visitor/value.rs +++ b/src/protocol/visitor/value.rs @@ -8,8 +8,8 @@ use crate::{ higher_ranked_type, hkt::Marker, protocol::{ - walker::hint::{HintKnown, HintMeta}, - Visitor, + walker::hint::{HintMeta, Meta}, + DynVisitor, }, }; @@ -69,7 +69,7 @@ pub struct ValueKnown<'a, T: ?Sized> { pub struct ValueKnownHrt<T: ?Sized>(Marker<T>); higher_ranked_type! { - impl HintKnown { + impl Meta { impl['a, 'ctx, T] type T['a, 'ctx] for ValueKnownHrt<T> = ValueKnown<'a, TypeName::T<'a, 'ctx, T>> where { @@ -89,16 +89,18 @@ impl<T: TypeName::MemberType, E: Effect> HintMeta for ValueProto<T, E> { type Known = ValueKnownHrt<T>; type Hint = (); + + type Effect = E; } pub fn visit_value<'a, 'ctx, T: Send + TypeName::LowerType<'a, 'ctx>, E: Effect>( - visitor: Visitor<'a, 'ctx>, + visitor: DynVisitor<'a, 'ctx>, value: T, ) -> Future<'a, VisitResult<T>, E> where TypeName::HigherRanked<'a, 'ctx, T>: TypeName::MemberType, { - if let Some(object) = visitor.upcast_mut::<ValueProto<TypeName::HigherRanked<'a, 'ctx, T>, E>>() + if let Some(object) = visitor.0.upcast_mut::<ValueProto<TypeName::HigherRanked<'a, 'ctx, T>, E>>() { // Allow the visitor to give a hint if it wants. object.visit(value) @@ -107,168 +109,3 @@ where E::ready(VisitResult::Skipped(value)) } } - -// #[cfg(test)] -// mod test { -// use core::marker::PhantomData; -// -// use crate::{ -// any::{AnyTrait, BorrowedMutStatic, BorrowedStatic, OwnedStatic}, -// any_trait, -// effect::{BlockOn, Blocking, Spin}, -// }; -// -// use super::*; -// -// #[test] -// fn visit() { -// struct Visitor<E>(Option<i32>, PhantomData<fn() -> E>); -// -// impl<'ctx, E> Value<'ctx, OwnedStatic<i32>, E> for Visitor<E> -// where -// E: Effect, -// { -// fn visit<'a>(&'a mut self, OwnedStatic(value): OwnedStatic<i32>) -> Future<'a, Flow, E> -// where -// 'ctx: 'a, -// { -// E::wrap(async move { -// self.0 = Some(value); -// Flow::Continue -// }) -// } -// } -// -// impl<'ctx, E> Value<'ctx, BorrowedStatic<'ctx, i32>, E> for Visitor<E> -// where -// E: Effect, -// { -// fn visit<'a>( -// &'a mut self, -// BorrowedStatic(value): BorrowedStatic<'ctx, i32>, -// ) -> Future<'a, Flow, E> -// where -// 'ctx: 'a, -// { -// E::wrap(async { -// self.0 = Some(*value); -// Flow::Continue -// }) -// } -// } -// -// any_trait! { -// impl['ctx, E] Visitor<E> = [ -// DynValue<'ctx, OwnedStatic<i32>, E>, -// DynValue<'ctx, BorrowedStatic<'ctx, i32>, E>, -// ] where E: Effect, -// } -// -// let mut v = Visitor::<Blocking>(None, PhantomData); -// let object: &mut (dyn AnyTrait<'_> + Send) = &mut v; -// let _ = Spin::block_on( -// object -// .upcast_mut::<DynValue<'_, OwnedStatic<i32>, Blocking>>() -// .unwrap() -// .visit(OwnedStatic(42)), -// ); -// -// assert_eq!(v.0, Some(42)); -// -// let object: &mut (dyn AnyTrait<'_> + Send) = &mut v; -// let _ = Spin::block_on( -// object -// .upcast_mut::<DynValue<'_, BorrowedStatic<'_, i32>, Blocking>>() -// .unwrap() -// .visit(BorrowedStatic(&101)), -// ); -// -// assert_eq!(v.0, Some(101)); -// } -// -// #[test] -// fn visit_borrowed() { -// struct Visitor<'ctx, E>(Option<&'ctx mut String>, PhantomData<fn() -> E>); -// -// impl<'ctx, E> Value<'ctx, BorrowedMutStatic<'ctx, String>, E> for Visitor<'ctx, E> -// where -// E: Effect, -// { -// fn visit<'a>( -// &'a mut self, -// BorrowedMutStatic(value): BorrowedMutStatic<'ctx, String>, -// ) -> Future<'a, Flow, E> -// where -// 'ctx: 'a, -// { -// E::wrap(async { -// self.0 = Some(value); -// -// Flow::Continue -// }) -// } -// } -// -// any_trait! { -// impl['ctx, E] Visitor<'ctx, E> = [ -// DynValue<'ctx, BorrowedMutStatic<'ctx, String>, E>, -// ] where E: Effect -// } -// -// let mut v = Visitor::<Blocking>(None, PhantomData); -// -// let mut y = String::from("abc"); -// let object: &mut (dyn AnyTrait<'_> + Send) = &mut v; -// let _ = Spin::block_on( -// object -// .upcast_mut::<DynValue<'_, BorrowedMutStatic<'_, _>, Blocking>>() -// .unwrap() -// .visit(BorrowedMutStatic(&mut y)), -// ); -// -// v.0.unwrap().push_str("def"); -// assert_eq!(y, "abcdef"); -// } -// -// #[test] -// fn visit_borrowed_unsized() { -// struct Visitor<'ctx, E>(Option<&'ctx str>, PhantomData<fn() -> E>); -// -// impl<'ctx, E> Value<'ctx, BorrowedStatic<'ctx, str>, E> for Visitor<'ctx, E> -// where -// E: Effect, -// { -// fn visit<'a>( -// &'a mut self, -// BorrowedStatic(value): BorrowedStatic<'ctx, str>, -// ) -> Future<'a, Flow, E> -// where -// 'ctx: 'a, -// { -// E::wrap(async { -// self.0 = Some(value); -// Flow::Continue -// }) -// } -// } -// -// any_trait! { -// impl['ctx, E] Visitor<'ctx, E> = [ -// DynValue<'ctx, BorrowedStatic<'ctx, str>, E>, -// ] where E: Effect -// } -// -// let mut v = Visitor::<Blocking>(None, PhantomData); -// -// let y = String::from("abc"); -// let object: &mut (dyn AnyTrait<'_> + Send) = &mut v; -// let _ = Spin::block_on( -// object -// .upcast_mut::<DynValue<'_, BorrowedStatic<'_, str>, Blocking>>() -// .unwrap() -// .visit(BorrowedStatic(&y)), -// ); -// -// assert_eq!(v.0, Some("abc")); -// } -// } |