grass_runtime/algorithm/intersect/
mod.rs1mod 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 {}