use core::ops::ControlFlow;
use crate::{
effect::{Effect, Future},
higher_ranked_type,
hkt::AnySend,
nameable,
protocol::{walker::hint::HintMeta, Visitor}, Flow, never::Never,
};
pub trait Sequence<'ctx> {
type Effect: Effect<'ctx>;
fn visit<'a>(
&'a mut self,
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 DynSequence<'a, 'ctx, E> where {
E: Effect<'ctx>,
'ctx: 'a
}
impl [E] where DynSequence<'a, 'ctx, E> {
E: Effect<'ctx>,
'ctx: 'a
}
}
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, 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 SequenceFlow {
Done,
Continue,
Break,
}
higher_ranked_type! {
pub type KnownHkt['ctx]: (AnySend) = for<'lt> Known
}
#[derive(Default)]
pub struct Known {
pub len: (usize, Option<usize>),
}
pub struct Hint {
pub len: (usize, Option<usize>),
}
impl<'a, 'ctx: 'a, E: Effect<'ctx>> HintMeta<'ctx> for DynSequence<'a, 'ctx, E> {
type Known = KnownHkt<'ctx>;
type Hint = Hint;
}