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