diff --git a/src/groupbylazy.rs b/src/groupbylazy.rs index a5a321df4..80c6f09f3 100644 --- a/src/groupbylazy.rs +++ b/src/groupbylazy.rs @@ -19,7 +19,7 @@ impl KeyFunction for F /// `ChunkIndex` acts like the grouping key function for `IntoChunks` -#[derive(Debug)] +#[derive(Debug, Clone)] struct ChunkIndex { size: usize, index: usize, @@ -50,7 +50,7 @@ impl KeyFunction for ChunkIndex { } } - +#[derive(Clone)] struct GroupInner where I: Iterator { @@ -471,6 +471,13 @@ pub struct IntoChunks index: Cell, } +impl Clone for IntoChunks + where I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(inner, index); +} + impl IntoChunks where I: Iterator, @@ -507,6 +514,7 @@ impl<'a, I> IntoIterator for &'a IntoChunks /// /// See [`.chunks()`](crate::Itertools::chunks) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone)] pub struct Chunks<'a, I: 'a> where I: Iterator, I::Item: 'a, diff --git a/tests/quick.rs b/tests/quick.rs index 0adcf1ad7..7af0ef602 100644 --- a/tests/quick.rs +++ b/tests/quick.rs @@ -993,6 +993,17 @@ quickcheck! { } } +quickcheck! { + fn chunk_clone_equal(a: Vec, size: u8) -> () { + let mut size = size; + if size == 0 { + size += 1; + } + let it = a.chunks(size as usize); + itertools::assert_equal(it.clone(), it); + } +} + quickcheck! { fn equal_chunks_lazy(a: Vec, size: u8) -> bool { let mut size = size;