Diffstat (limited to 'src/impls/core/iterator.rs')
| -rw-r--r-- | src/impls/core/iterator.rs | 76 |
1 files changed, 0 insertions, 76 deletions
diff --git a/src/impls/core/iterator.rs b/src/impls/core/iterator.rs deleted file mode 100644 index cdcd71b..0000000 --- a/src/impls/core/iterator.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::protocol::ImplementerExt; -use crate::protocols::{sequence, ControlFlow}; -use crate::walk::WalkOnce; - -pub struct IterWalker<'ctx, I> -where - I: Iterator, - <I as Iterator>::Item: WalkOnce<'ctx>, -{ - iter: I, - err: Option<<<I as Iterator>::Item as WalkOnce<'ctx>>::Error>, -} - -impl<'ctx, I> IterWalker<'ctx, I> -where - I: Iterator, - <I as Iterator>::Item: WalkOnce<'ctx>, -{ - pub fn new<T: IntoIterator<IntoIter = I>>(iter: T) -> Self { - Self { - iter: iter.into_iter(), - err: None, - } - } -} - -impl<'ctx, I> WalkOnce<'ctx> for IterWalker<'ctx, I> -where - I: Iterator, - <I as Iterator>::Item: WalkOnce<'ctx>, -{ - type Error = <<I as Iterator>::Item as WalkOnce<'ctx>>::Error; - - type Value = (); - - #[inline] - fn walk_once( - mut self, - visitor: &mut dyn crate::protocol::Implementer<'ctx>, - ) -> Result<Self::Value, Self::Error> { - if let Some(interface) = visitor.interface_for::<sequence::Sequence>() { - match interface.as_object().visit(&mut self) { - ControlFlow::Done => Ok(()), - ControlFlow::Error => match self.err { - Some(err) => Err(err), - None => Ok(()), - }, - } - } else { - Ok(()) - } - } -} - -impl<'ctx, I> sequence::Accessor<'ctx> for IterWalker<'ctx, I> -where - I: Iterator, - <I as Iterator>::Item: WalkOnce<'ctx>, -{ - fn next( - &mut self, - visitor: &mut dyn crate::protocol::Implementer<'ctx>, - ) -> sequence::ControlFlow { - if let Some(item) = self.iter.next() { - match item.walk_once(visitor) { - Ok(_) => sequence::ControlFlow::Continue, - Err(err) => { - self.err = Some(err); - sequence::ControlFlow::Error - } - } - } else { - sequence::ControlFlow::Done - } - } -} |