]>
git.proxmox.com Git - rustc.git/blob - vendor/itertools/src/intersperse.rs
1 use std
::iter
::{Fuse, FusedIterator}
;
4 pub trait IntersperseElement
<Item
> {
5 fn generate(&mut self) -> Item
;
8 #[derive(Debug, Clone)]
9 pub struct IntersperseElementSimple
<Item
>(Item
);
11 impl<Item
: Clone
> IntersperseElement
<Item
> for IntersperseElementSimple
<Item
> {
12 fn generate(&mut self) -> Item
{
17 /// An iterator adaptor to insert a particular value
18 /// between each element of the adapted iterator.
20 /// Iterator element type is `I::Item`
22 /// This iterator is *fused*.
24 /// See [`.intersperse()`](crate::Itertools::intersperse) for more information.
25 pub type Intersperse
<I
> = IntersperseWith
<I
, IntersperseElementSimple
<<I
as Iterator
>::Item
>>;
27 /// Create a new Intersperse iterator
28 pub fn intersperse
<I
>(iter
: I
, elt
: I
::Item
) -> Intersperse
<I
>
31 intersperse_with(iter
, IntersperseElementSimple(elt
))
34 impl<Item
, F
: FnMut()->Item
> IntersperseElement
<Item
> for F
{
35 fn generate(&mut self) -> Item
{
40 /// An iterator adaptor to insert a particular value created by a function
41 /// between each element of the adapted iterator.
43 /// Iterator element type is `I::Item`
45 /// This iterator is *fused*.
47 /// See [`.intersperse_with()`](crate::Itertools::intersperse_with) for more information.
48 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
49 #[derive(Clone, Debug)]
50 pub struct IntersperseWith
<I
, ElemF
>
55 peek
: Option
<I
::Item
>,
58 /// Create a new IntersperseWith iterator
59 pub fn intersperse_with
<I
, ElemF
>(iter
: I
, elt
: ElemF
) -> IntersperseWith
<I
, ElemF
>
62 let mut iter
= iter
.fuse();
70 impl<I
, ElemF
> Iterator
for IntersperseWith
<I
, ElemF
>
72 ElemF
: IntersperseElement
<I
::Item
>
76 fn next(&mut self) -> Option
<Self::Item
> {
77 if self.peek
.is_some() {
80 self.peek
= self.iter
.next();
81 if self.peek
.is_some() {
82 Some(self.element
.generate())
89 fn size_hint(&self) -> (usize, Option
<usize>) {
90 // 2 * SH + { 1 or 0 }
91 let has_peek
= self.peek
.is_some() as usize;
92 let sh
= self.iter
.size_hint();
93 size_hint
::add_scalar(size_hint
::add(sh
, sh
), has_peek
)
96 fn fold
<B
, F
>(mut self, init
: B
, mut f
: F
) -> B
where
97 Self: Sized
, F
: FnMut(B
, Self::Item
) -> B
,
101 if let Some(x
) = self.peek
.take() {
105 let element
= &mut self.element
;
107 self.iter
.fold(accum
,
109 let accum
= f(accum
, element
.generate());
110 let accum
= f(accum
, x
);
116 impl<I
, ElemF
> FusedIterator
for IntersperseWith
<I
, ElemF
>
118 ElemF
: IntersperseElement
<I
::Item
>