Diffstat (limited to 'src/impls/core/iterator.rs')
| -rw-r--r-- | src/impls/core/iterator.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/impls/core/iterator.rs b/src/impls/core/iterator.rs new file mode 100644 index 0000000..713b66e --- /dev/null +++ b/src/impls/core/iterator.rs @@ -0,0 +1,56 @@ +use core::marker::PhantomData; + +use crate::{ + error::UniError, protocol::ProtocolDescription, protocols::sequence, walk::WalkOnce, Fallible, + Visitor, WalkStatus, Walker, +}; + +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<'value, 'ctx, I, WalkerErr, VisitorErr: 'value> + IterWalker<'value, 'ctx, I, WalkerErr, VisitorErr> +where + I: Iterator, +{ + 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, + ) + } +} + +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> +where + I: Iterator, +{ + 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)?; + } + + Ok(WalkStatus::Done) + } +} |