grass_runtime/algorithm/
merge.rs

1use 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}