grass_runtime/algorithm/intersect/
mod.rs

1mod heap;
2mod inner;
3mod outer;
4
5use crate::property::Region;
6use crate::{algorithm::markers::Sorted, record::ToSelfContained};
7
8use inner::{Context, State};
9
10pub use inner::SortedIntersectIter;
11
12pub struct ToSelfContainedIter<T: Iterator>
13where
14    T::Item: ToSelfContained,
15{
16    inner: T,
17}
18
19impl<T: Iterator> Iterator for ToSelfContainedIter<T>
20where
21    T::Item: ToSelfContained,
22{
23    type Item = <T::Item as ToSelfContained>::SelfContained;
24    fn next(&mut self) -> Option<Self::Item> {
25        self.inner.next().map(|what| what.to_self_contained())
26    }
27}
28
29impl<T: Sorted> Sorted for ToSelfContainedIter<T> where T::Item: ToSelfContained {}
30
31pub trait SortedIntersect: Iterator + Sorted + Sized {
32    fn sorted_intersect<U, Other: Iterator<Item = U> + Sorted>(
33        self,
34        other: Other,
35    ) -> SortedIntersectIter<ToSelfContainedIter<Self>, ToSelfContainedIter<Other>>
36    where
37        Self::Item: ToSelfContained,
38        <Self::Item as ToSelfContained>::SelfContained: Clone + Region,
39        U: ToSelfContained,
40        U::SelfContained: Clone + Region,
41    {
42        SortedIntersectIter {
43            context_a: Context::from_iter(ToSelfContainedIter { inner: self }),
44            context_b: Context::from_iter(ToSelfContainedIter { inner: other }),
45            state: State::FrontierA(0, 0, None),
46        }
47    }
48
49    fn sorted_left_outer_intersect<U: Region + Clone, Other: Iterator<Item = U> + Sorted>(
50        self,
51        other: Other,
52    ) -> outer::LeftOuterJoinIter<Self, Other>
53    where
54        Self::Item: Region + Clone,
55    {
56        outer::LeftOuterJoinIter::new(self, other)
57    }
58}
59
60impl<I: Iterator + Sorted> SortedIntersect for I {}