Skip to content

Commit 4ac4f43

Browse files
bors[bot]zertosh
andauthored
Merge #555
555: Add intersperse and intersperse_with free functions r=phimuemue a=zertosh Aside from automatic parameter conversion using `IntoIterator`, having `intersperse` and `intersperse_with` as free functions makes it easier for downstream code to avoid the `unstable_name_collisions` lint because of lib core's own similarly named `Iterator` methods. rust-lang/rust#48919 Co-authored-by: Andres Suarez <zertosh@gmail.com>
2 parents 2c82c5e + 0157591 commit 4ac4f43

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

src/free.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use alloc::{
1414
string::String,
1515
};
1616

17-
#[cfg(feature = "use_alloc")]
1817
use crate::Itertools;
18+
use crate::intersperse::{Intersperse, IntersperseWith};
1919

2020
pub use crate::adaptors::{
2121
interleave,
@@ -35,6 +35,41 @@ pub use crate::merge_join::merge_join_by;
3535
#[cfg(feature = "use_alloc")]
3636
pub use crate::rciter_impl::rciter;
3737

38+
/// Iterate `iterable` with a particular value inserted between each element.
39+
///
40+
/// [`IntoIterator`] enabled version of [`Iterator::intersperse`].
41+
///
42+
/// ```
43+
/// use itertools::intersperse;
44+
///
45+
/// itertools::assert_equal(intersperse((0..3), 8), vec![0, 8, 1, 8, 2]);
46+
/// ```
47+
pub fn intersperse<I>(iterable: I, element: I::Item) -> Intersperse<I::IntoIter>
48+
where I: IntoIterator,
49+
<I as IntoIterator>::Item: Clone
50+
{
51+
Itertools::intersperse(iterable.into_iter(), element)
52+
}
53+
54+
/// Iterate `iterable` with a particular value created by a function inserted
55+
/// between each element.
56+
///
57+
/// [`IntoIterator`] enabled version of [`Iterator::intersperse_with`].
58+
///
59+
/// ```
60+
/// use itertools::intersperse_with;
61+
///
62+
/// let mut i = 10;
63+
/// itertools::assert_equal(intersperse_with((0..3), || { i -= 1; i }), vec![0, 9, 1, 8, 2]);
64+
/// assert_eq!(i, 8);
65+
/// ```
66+
pub fn intersperse_with<I, F>(iterable: I, element: F) -> IntersperseWith<I::IntoIter, F>
67+
where I: IntoIterator,
68+
F: FnMut() -> I::Item
69+
{
70+
Itertools::intersperse_with(iterable.into_iter(), element)
71+
}
72+
3873
/// Iterate `iterable` with a running index.
3974
///
4075
/// [`IntoIterator`] enabled version of [`Iterator::enumerate`].

tests/test_core.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use core::iter;
99
use itertools as it;
1010
use crate::it::Itertools;
1111
use crate::it::interleave;
12+
use crate::it::intersperse;
13+
use crate::it::intersperse_with;
1214
use crate::it::multizip;
1315
use crate::it::free::put_back;
1416
use crate::it::iproduct;
@@ -136,6 +138,23 @@ fn test_interleave() {
136138
it::assert_equal(it, rs.iter());
137139
}
138140

141+
#[test]
142+
fn test_intersperse() {
143+
let xs = [1u8, 2, 3];
144+
let ys = [1u8, 0, 2, 0, 3];
145+
let it = intersperse(&xs, &0);
146+
it::assert_equal(it, ys.iter());
147+
}
148+
149+
#[test]
150+
fn test_intersperse_with() {
151+
let xs = [1u8, 2, 3];
152+
let ys = [1u8, 10, 2, 10, 3];
153+
let i = 10;
154+
let it = intersperse_with(&xs, || &i);
155+
it::assert_equal(it, ys.iter());
156+
}
157+
139158
#[allow(deprecated)]
140159
#[test]
141160
fn foreach() {

0 commit comments

Comments
 (0)