use either_or_both::EitherOrBoth::{self, Both};
use futures::stream::{self, StreamExt, TryStreamExt};
use std::cmp::Ordering;
use streamtools::StreamTools;
#[tokio::main]
async fn main() {
let left = stream::iter(vec![Ok(1), Ok(3), Err(4), Ok(5)]);
let right = stream::iter(vec![Ok(2), Ok(3), Err(3)]);
let stream = left
.merge_join_by(right, |left_result, right_result| {
match (left_result, right_result) {
(Ok(asset), Ok(foreign_asset)) => Ord::cmp(asset, foreign_asset),
(Err(_), Ok(_)) => Ordering::Less,
(Ok(_), Err(_)) => Ordering::Greater,
(Err(_), Err(_)) => Ordering::Equal,
}
})
.map(EitherOrBoth::<Result<_, _>, Result<_, _>>::transpose);
let result: Result<Vec<_>, EitherOrBoth<_>> = stream.try_collect().await;
assert_eq!(result, Err(Both(4, 3)));
}