grass_runtime/algorithm/
merge.rs1use std::iter::Peekable;
2
3use crate::{property::Region, record::Bed3};
4
5use super::Sorted;
6
7pub struct TwoWayMerge<IA, IB, R>
8where
9 IA: Iterator<Item = R> + Sorted,
10 IB: Iterator<Item = R> + Sorted,
11 R: Region,
12{
13 iter_a: Peekable<IA>,
14 iter_b: Peekable<IB>,
15}
16
17impl<IA, IB, R> Sorted for TwoWayMerge<IA, IB, R>
18where
19 IA: Iterator<Item = R> + Sorted,
20 IB: Iterator<Item = R> + Sorted,
21 R: Region,
22{
23}
24
25impl<IA, IB, R> Iterator for TwoWayMerge<IA, IB, R>
26where
27 IA: Iterator<Item = R> + Sorted,
28 IB: Iterator<Item = R> + Sorted,
29 R: Region,
30{
31 type Item = R;
32
33 fn next(&mut self) -> Option<Self::Item> {
34 match (self.iter_a.peek(), self.iter_b.peek()) {
35 (Some(a), Some(b)) if Bed3::new(a) <= Bed3::new(b) => self.iter_a.next(),
36 (Some(_), Some(_)) => self.iter_b.next(),
37 (_, None) => self.iter_a.next(),
38 (None, _) => self.iter_b.next(),
39 }
40 }
41}
42
43pub trait TwoWayMergeExt
44where
45 Self: Iterator + Sorted + Sized,
46 Self::Item: Region,
47{
48 fn merge_with<T>(self, other: T) -> TwoWayMerge<Self, T, Self::Item>
49 where
50 T: Iterator<Item = Self::Item> + Sorted + Sized,
51 {
52 TwoWayMerge {
53 iter_a: self.peekable(),
54 iter_b: other.peekable(),
55 }
56 }
57}
58
59impl<T> TwoWayMergeExt for T
60where
61 T: Iterator + Sorted + Sized,
62 T::Item: Region,
63{
64}