Diffstat (limited to 'src/impls/core/iterator.rs')
-rw-r--r--src/impls/core/iterator.rs75
1 files changed, 34 insertions, 41 deletions
diff --git a/src/impls/core/iterator.rs b/src/impls/core/iterator.rs
index 713b66e..1bd39b6 100644
--- a/src/impls/core/iterator.rs
+++ b/src/impls/core/iterator.rs
@@ -1,56 +1,49 @@
-use core::marker::PhantomData;
+use crate::{Walker, ControlFlow, walk::WalkOnce, protocol::lookup_visit, protocols::sequence};
-use crate::{
- error::UniError, protocol::ProtocolDescription, protocols::sequence, walk::WalkOnce, Fallible,
- Visitor, WalkStatus, Walker,
-};
+pub struct IterWalker<I> {
+ iter: I,
+}
-pub struct IterWalker<'value, 'ctx, I: Iterator, WalkerErr, VisitorErr>(
- I,
- fn(
- I::Item,
- &mut dyn Visitor<'value, 'ctx, WalkerErr, Error = VisitorErr>,
- ) -> Result<WalkStatus, UniError<WalkerErr, VisitorErr>>,
- PhantomData<&'value &'ctx ()>,
-);
+impl<I> IterWalker<I>{
+ pub fn new<T: IntoIterator<IntoIter = I>>(iter: T) -> Self {
+ Self {
+ iter: iter.into_iter()
+ }
+ }
+}
-impl<'value, 'ctx, I, WalkerErr, VisitorErr: 'value>
- IterWalker<'value, 'ctx, I, WalkerErr, VisitorErr>
+impl<'ctx, I> Walker<'ctx> for IterWalker<I>
where
I: Iterator,
+ <I as Iterator>::Item: WalkOnce<'ctx>
{
- pub fn new<T>(into_iter: T) -> Self
- where
- T: IntoIterator<IntoIter = I>,
- <I as Iterator>::Item: WalkOnce<'value, 'ctx, Error = WalkerErr>,
- {
- Self(
- into_iter.into_iter(),
- |item, visitor| item.into_walker().walk(visitor),
- PhantomData,
- )
+ fn walk(&mut self, visitor: &mut dyn crate::Visitor<'ctx>) -> ControlFlow {
+ match lookup_visit::<sequence::Sequence, _>(visitor) {
+ Ok(visit) => {
+ visit.visit(self).to_done()
+ },
+ Err(err) => {
+ ControlFlow::Error
+ },
+ }
}
}
-impl<'value, 'ctx, I: Iterator, WalkerErr, VisitorErr> Fallible
- for IterWalker<'value, 'ctx, I, WalkerErr, VisitorErr>
-{
- type Error = WalkerErr;
-}
-
-impl<'value, 'ctx, I, WalkerErr, VisitorErr> Walker<'value, 'ctx, VisitorErr>
- for IterWalker<'value, 'ctx, I, WalkerErr, VisitorErr>
+impl<'ctx, I> sequence::Accessor<'ctx> for IterWalker<I>
where
I: Iterator,
+ <I as Iterator>::Item: WalkOnce<'ctx>
{
- fn walk(
- &mut self,
- visitor: &mut dyn Visitor<'value, 'ctx, Self::Error, Error = VisitorErr>,
- ) -> Result<WalkStatus, UniError<Self::Error, VisitorErr>> {
- while let Some(item) = self.0.next() {
- (self.1)(item, visitor)?;
+ fn next(&mut self, visitor: &mut dyn crate::Visitor<'ctx>) -> ControlFlow {
+ if let Some(value) = self.iter.next() {
+ match value.walk_once(visitor) {
+ Ok(_) => ControlFlow::Continue,
+ Err(err) => {
+ ControlFlow::Error
+ },
+ }
+ } else {
+ ControlFlow::Done
}
-
- Ok(WalkStatus::Done)
}
}