1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use std::{collections::HashMap, hash::Hash};
use crate::core::{relation::RelationInner, CountMap, Op, Op_, Relation};
pub struct Consolidate<C: Op_>(RelationInner<C>);
impl<C: Op> Op_ for Consolidate<C>
where
C::D: Eq + Hash,
{
type T = (C::D, isize);
fn foreach<'a>(&'a mut self, mut continuation: impl FnMut(Self::T) + 'a) {
let mut m = HashMap::new();
self.0.foreach(|(x, count)| m.add(x, count));
for x in m {
continuation(x)
}
}
fn get_type_name() -> &'static str {
"consolidate"
}
}
impl<C: Op_<T = (D, isize)>, D: Eq + Hash> Relation<C> {
pub fn consolidate(self) -> Relation<Consolidate<C>> {
self.context_tracker.add_relation(
self.dirty,
Consolidate(self.inner),
vec![self.tracking_index],
)
}
}