standing_relations/core/op/
consolidate.rs

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