]>
git.proxmox.com Git - rustc.git/blob - vendor/itertools-0.8.2/src/merge_join.rs
1 use std
::cmp
::Ordering
;
5 use super::adaptors
::{PutBack, put_back}
;
6 use either_or_both
::EitherOrBoth
;
8 /// Return an iterator adaptor that merge-joins items from the two base iterators in ascending order.
10 /// See [`.merge_join_by()`](trait.Itertools.html#method.merge_join_by) for more information.
11 pub fn merge_join_by
<I
, J
, F
>(left
: I
, right
: J
, cmp_fn
: F
)
12 -> MergeJoinBy
<I
::IntoIter
, J
::IntoIter
, F
>
13 where I
: IntoIterator
,
15 F
: FnMut(&I
::Item
, &J
::Item
) -> Ordering
18 left
: put_back(left
.into_iter().fuse()),
19 right
: put_back(right
.into_iter().fuse()),
24 /// An iterator adaptor that merge-joins items from the two base iterators in ascending order.
26 /// See [`.merge_join_by()`](../trait.Itertools.html#method.merge_join_by) for more information.
27 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
28 pub struct MergeJoinBy
<I
: Iterator
, J
: Iterator
, F
> {
29 left
: PutBack
<Fuse
<I
>>,
30 right
: PutBack
<Fuse
<J
>>,
34 impl<I
, J
, F
> fmt
::Debug
for MergeJoinBy
<I
, J
, F
>
35 where I
: Iterator
+ fmt
::Debug
,
37 J
: Iterator
+ fmt
::Debug
,
40 debug_fmt_fields
!(MergeJoinBy
, left
, right
);
43 impl<I
, J
, F
> Iterator
for MergeJoinBy
<I
, J
, F
>
46 F
: FnMut(&I
::Item
, &J
::Item
) -> Ordering
48 type Item
= EitherOrBoth
<I
::Item
, J
::Item
>;
50 fn next(&mut self) -> Option
<Self::Item
> {
51 match (self.left
.next(), self.right
.next()) {
54 Some(EitherOrBoth
::Left(left
)),
55 (None
, Some(right
)) =>
56 Some(EitherOrBoth
::Right(right
)),
57 (Some(left
), Some(right
)) => {
58 match (self.cmp_fn
)(&left
, &right
) {
60 Some(EitherOrBoth
::Both(left
, right
)),
62 self.right
.put_back(right
);
63 Some(EitherOrBoth
::Left(left
))
65 Ordering
::Greater
=> {
66 self.left
.put_back(left
);
67 Some(EitherOrBoth
::Right(right
))
74 fn size_hint(&self) -> (usize, Option
<usize>) {
75 let (a_lower
, a_upper
) = self.left
.size_hint();
76 let (b_lower
, b_upper
) = self.right
.size_hint();
78 let lower
= ::std
::cmp
::max(a_lower
, b_lower
);
80 let upper
= match (a_upper
, b_upper
) {
81 (Some(x
), Some(y
)) => Some(x
+ y
),