Diffstat (limited to 'src/protocol/visitor/sequence.rs')
| -rw-r--r-- | src/protocol/visitor/sequence.rs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/protocol/visitor/sequence.rs b/src/protocol/visitor/sequence.rs index e9dd721..a3ca785 100644 --- a/src/protocol/visitor/sequence.rs +++ b/src/protocol/visitor/sequence.rs @@ -5,7 +5,7 @@ use crate::{ higher_ranked_type, hkt::AnySend, nameable, - protocol::{walker::hint::HintMeta, Visitor}, + protocol::{walker::hint::HintMeta, Visitor}, Flow, never::Never, }; pub trait Sequence<'ctx> { @@ -13,38 +13,46 @@ pub trait Sequence<'ctx> { fn visit<'a>( &'a mut self, - scope: &'a mut dyn SequenceScope<'ctx, Self::Effect>, - ) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect>; + scope: DynSequenceScope<'a, 'ctx, Self::Effect>, + ) -> Future<'a, 'ctx, Flow<Never>, Self::Effect>; } +pub type DynSequence<'a, 'ctx, E> = dyn Sequence<'ctx, Effect = E> + Send + 'a; + nameable! { pub struct Name['a, 'ctx, E]; - impl [E] for dyn Sequence<'ctx, Effect = E> + 'a where { + impl [E] for DynSequence<'a, 'ctx, E> where { E: Effect<'ctx>, 'ctx: 'a } - impl [E] where dyn Sequence<'ctx, Effect = E> + 'a { + impl [E] where DynSequence<'a, 'ctx, E> { E: Effect<'ctx>, 'ctx: 'a } } -pub trait SequenceScope<'ctx, E> -where - E: Effect<'ctx>, -{ +pub trait SequenceScope<'ctx> { + type Effect: Effect<'ctx>; + + fn size_hint<'a>( + &'a mut self, + ) -> Future<'a, 'ctx, (usize, Option<usize>), Self::Effect>; + fn next<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - ) -> Future<'a, 'ctx, ControlFlow<(), Status>, E>; + ) -> Future<'a, 'ctx, SequenceFlow, Self::Effect>; } +pub type DynSequenceScope<'a, 'ctx, E> = &'a mut (dyn SequenceScope<'ctx, Effect = E> + Send + 'a); + #[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Debug)] -pub enum Status { +pub enum SequenceFlow { Done, Continue, + Break, } higher_ranked_type! { @@ -60,7 +68,7 @@ pub struct Hint { pub len: (usize, Option<usize>), } -impl<'a, 'ctx: 'a, E: Effect<'ctx>> HintMeta<'ctx> for dyn Sequence<'ctx, Effect = E> + '_ { +impl<'a, 'ctx: 'a, E: Effect<'ctx>> HintMeta<'ctx> for DynSequence<'a, 'ctx, E> { type Known = KnownHkt<'ctx>; type Hint = Hint; |