Diffstat (limited to 'src/impls/core/iterator.rs')
| -rw-r--r-- | src/impls/core/iterator.rs | 75 |
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) } } |