Diffstat (limited to 'tests/demo.rs')
-rw-r--r--tests/demo.rs70
1 files changed, 43 insertions, 27 deletions
diff --git a/tests/demo.rs b/tests/demo.rs
index 9812ef6..c644f73 100644
--- a/tests/demo.rs
+++ b/tests/demo.rs
@@ -6,9 +6,9 @@ use treaty::{
into_walker,
protocol::{
visitor::{Sequence, SequenceScope, Value},
- ControlFlowFor, SyncEffect, Visitor,
+ Yield, SyncEffect, Visitor,
},
- Builder, Walk, Walker,
+ AsVisitor, Builder, Walk, Walker,
};
#[test]
@@ -22,12 +22,12 @@ fn demo() {
dbg!(array_to_array2([true, false]));
dbg!(array_to_array([true, true]));
- let s = build_with::<array::Builder<'_, JsonLike, 3>, _>(into_walker(&a)).unwrap();
+ let s = build_with::<array::Builder<'_, JsonLike, 3, _>, _>(into_walker(&a)).unwrap();
dbg!(s);
use treaty::builders::serde::deserialize::Builder as SerdeBuilder;
- let x = build_with::<SerdeBuilder<serde_json::Value>, _>(into_walker(&a)).unwrap();
+ let x = build_with::<SerdeBuilder<serde_json::Value, _>, _>(into_walker(&a)).unwrap();
dbg!(x);
// let s = build_with::<JsonLike, _>(into_walker(a)).unwrap();
@@ -74,32 +74,38 @@ const _: () = {
fn walk<'a>(
self,
- visitor: &'a mut Visitor<'a, 'ctx>,
- ) -> ControlFlowFor<'a, SyncEffect, Self::Error, Self::Output> {
+ visitor: Visitor<'a, 'ctx, SyncEffect>,
+ ) -> Yield<'a, 'ctx, Result<Self::Output, Self::Error>, SyncEffect>
+ where
+ 'ctx: 'a,
+ {
match self.0 {
Data::Bool(value) => walk_bool(*value, visitor),
Data::Sequence(value) => walk_vec(value, visitor),
}
- core::ops::ControlFlow::Continue(())
+ Ok(())
}
}
};
-fn walk_bool(value: bool, visitor: &mut Visitor<'_, '_>) {
+fn walk_bool(value: bool, visitor: Visitor<'_, '_, SyncEffect>) {
visitor
- .upcast_mut::<dyn Value<OwnedStatic<bool>>>()
+ .upcast_mut::<dyn Value<OwnedStatic<bool>, SyncEffect>>()
.unwrap()
.visit(OwnedStatic(value));
}
-fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: &'a mut Visitor<'a, 'ctx>) {
+fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: Visitor<'a, 'ctx, SyncEffect>) {
struct Scope<'ctx>(VecDeque<&'ctx Data>);
- impl<'ctx> SequenceScope<'ctx> for Scope<'ctx> {
+ impl<'ctx> SequenceScope<'ctx, SyncEffect> for Scope<'ctx> {
fn next<'a>(
&'a mut self,
- visitor: &'a mut Visitor<'a, 'ctx>,
- ) -> ControlFlowFor<'a, SyncEffect, treaty::protocol::visitor::Status> {
+ visitor: Visitor<'a, 'ctx, SyncEffect>,
+ ) -> Yield<'a, 'ctx, ControlFlow<(), treaty::protocol::visitor::Status>, SyncEffect>
+ where
+ 'ctx: 'a,
+ {
if let Some(value) = self.0.pop_front() {
into_walker(value).walk(visitor);
@@ -113,7 +119,7 @@ fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: &'a mut Visitor<'a, 'ctx>) {
let mut scope = Scope(value.into_iter().collect());
visitor
- .upcast_mut::<dyn Sequence<'_>>()
+ .upcast_mut::<dyn Sequence<'_, SyncEffect>>()
.unwrap()
.visit(&mut scope);
}
@@ -121,16 +127,12 @@ fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: &'a mut Visitor<'a, 'ctx>) {
#[derive(Default)]
struct JsonLike(String);
-impl<'ctx> Builder<'ctx> for JsonLike {
+impl<'ctx> Builder<'ctx, SyncEffect> for JsonLike {
type Error = ();
type Value = String;
- fn as_visitor(&mut self) -> &mut Visitor<'_, 'ctx> {
- self
- }
-
- fn build(self) -> Result<Self::Value, Self::Error> {
+ fn build<'a>(self) -> Result<Self::Value, Self::Error> where Self: 'a {
Ok(self.0)
}
@@ -139,27 +141,41 @@ impl<'ctx> Builder<'ctx> for JsonLike {
fn from_seed(seed: Self::Seed) -> Self {
Self::default()
}
+
+ type Effect = SyncEffect;
+}
+
+impl<'ctx> AsVisitor<'ctx, SyncEffect> for JsonLike {
+ fn as_visitor(&mut self) -> Visitor<'_, 'ctx, SyncEffect> {
+ self
+ }
}
any_trait! {
impl['a, 'ctx] JsonLike = [
- dyn Value<'a, OwnedStatic<bool>> + 'a,
- dyn Sequence<'ctx> + 'a,
+ dyn Value<'ctx, OwnedStatic<bool>, SyncEffect> + 'a,
+ dyn Sequence<'ctx, SyncEffect> + 'a,
]
}
-impl Value<'_, OwnedStatic<bool>> for JsonLike {
- fn visit(&mut self, value: OwnedStatic<bool>) -> ControlFlowFor<'_> {
+impl<'ctx> Value<'ctx, OwnedStatic<bool>, SyncEffect> for JsonLike {
+ fn visit<'a>(&'a mut self, value: OwnedStatic<bool>) -> Yield<'a, 'ctx, ControlFlow<(), ()>, SyncEffect>
+ where
+ 'ctx: 'a,
+ {
self.0.push_str(&format!("{}", value.0));
ControlFlow::Continue(())
}
}
-impl<'ctx> Sequence<'ctx> for JsonLike {
+impl<'ctx> Sequence<'ctx, SyncEffect> for JsonLike {
fn visit<'a>(
&'a mut self,
- scope: &'a mut dyn SequenceScope<'ctx>,
- ) -> ControlFlowFor<'a, SyncEffect> {
+ scope: &'a mut dyn SequenceScope<'ctx, SyncEffect>,
+ ) -> Yield<'a, 'ctx, ControlFlow<(), ()>, SyncEffect>
+ where
+ 'ctx: 'a,
+ {
self.0.push_str("[");
while let ControlFlow::Continue(treaty::protocol::visitor::Status::Continue) =
scope.next(self)