-
Notifications
You must be signed in to change notification settings - Fork 335
Description
It seems that merge_join_by/MergeJoinBy is actually a more generic variant of merge/MergeBy.
However, currently, the MergeJoinBy and MergeBy are implemented independently (PutBack vs Peekable, fused behavior, requiring Ordering vs bool). The past showed that uniform implementations may be better.
This change should not introduce breaking changes for users: merge, merge_by and merge_join_by should stay usable as they are.
However, I'd imagine that the general merge_join_by could also accept a comparator returning bool (instead of Ordering) - this would free the users from having to deal with the EitherOrBoth::Both case. I.e. I suggest that users should be able to write:
use itertools; // 0.10.5
use itertools::{Either, EitherOrBoth};
fn main() {
let numbers = [1,2,3,4,5];
let strings = ["one", "two", "three", "four"];
for x in itertools::merge_join_by(
numbers,
strings,
|number, string| number.cmp(&string.len()),
) {
match x {
EitherOrBoth::Left(number) => {dbg!(number);},
EitherOrBoth::Right(string) => {dbg!(string);},
EitherOrBoth::Both(number, string) => {dbg!(number, string);},
};
}
for x in itertools::merge_join_by(
numbers,
strings,
|number, string| number < &string.len(), // <-- Note that we return bool instead of Ordering
) {
match x {
Either::Left(number) => {dbg!(number);},
Either::Right(string) => {dbg!(string);},
// <-- Note that we do not need to deal with the "Both" case, as our comparator returns bool
};
}
}
When we tackle this, we should - as a first step - probably move all the merge-related functions into an own module.