From 3dab85526024851a7ef9776cc9375d5a3311609b Mon Sep 17 00:00:00 2001 From: Easyoakland <97992568+Easyoakland@users.noreply.github.com> Date: Tue, 21 Mar 2023 19:28:41 -0600 Subject: [PATCH 1/3] Added derive clone to Chunks. --- src/groupbylazy.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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, From e01a74b55dfa7ca129c17ee430c97818fd4aa646 Mon Sep 17 00:00:00 2001 From: Easyoakland <97992568+Easyoakland@users.noreply.github.com> Date: Tue, 21 Mar 2023 19:46:30 -0600 Subject: [PATCH 2/3] Added test that `Chunks` clone works correctly. --- tests/test_std.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_std.rs b/tests/test_std.rs index 77207d87e..0ea01408b 100644 --- a/tests/test_std.rs +++ b/tests/test_std.rs @@ -842,6 +842,7 @@ fn group_by_lazy_3() { fn chunks() { let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let grouper = data.iter().chunks(3); + let grouper_clone = grouper.clone(); for (i, chunk) in grouper.into_iter().enumerate() { match i { 0 => it::assert_equal(chunk, &[0, 0, 0]), @@ -851,6 +852,15 @@ fn chunks() { _ => unreachable!(), } } + for (i, chunk) in grouper_clone.into_iter().enumerate() { + match i { + 0 => it::assert_equal(chunk, &[0, 0, 0]), + 1 => it::assert_equal(chunk, &[1, 1, 0]), + 2 => it::assert_equal(chunk, &[0, 2, 2]), + 3 => it::assert_equal(chunk, &[3, 3]), + _ => unreachable!(), + } + } } #[test] From d6082831e7f2f80723bf0caf04703a62c5b0faae Mon Sep 17 00:00:00 2001 From: Easyoakland <97992568+Easyoakland@users.noreply.github.com> Date: Thu, 23 Mar 2023 14:42:34 -0600 Subject: [PATCH 3/3] Changed chunk clone test to quicktest. --- tests/quick.rs | 11 +++++++++++ tests/test_std.rs | 10 ---------- 2 files changed, 11 insertions(+), 10 deletions(-) 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; diff --git a/tests/test_std.rs b/tests/test_std.rs index 0ea01408b..77207d87e 100644 --- a/tests/test_std.rs +++ b/tests/test_std.rs @@ -842,7 +842,6 @@ fn group_by_lazy_3() { fn chunks() { let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let grouper = data.iter().chunks(3); - let grouper_clone = grouper.clone(); for (i, chunk) in grouper.into_iter().enumerate() { match i { 0 => it::assert_equal(chunk, &[0, 0, 0]), @@ -852,15 +851,6 @@ fn chunks() { _ => unreachable!(), } } - for (i, chunk) in grouper_clone.into_iter().enumerate() { - match i { - 0 => it::assert_equal(chunk, &[0, 0, 0]), - 1 => it::assert_equal(chunk, &[1, 1, 0]), - 2 => it::assert_equal(chunk, &[0, 2, 2]), - 3 => it::assert_equal(chunk, &[3, 3]), - _ => unreachable!(), - } - } } #[test]