dfir_rs/compiled/pull/half_join_state/
fold_from.rs

1use std::collections::hash_map::Entry::*;
2
3use rustc_hash::FxHashMap;
4
5use crate::util::clear::Clear;
6
7pub struct HalfJoinStateFoldFrom<K, A> {
8    pub table: FxHashMap<K, A>,
9}
10
11impl<K, A> Default for HalfJoinStateFoldFrom<K, A> {
12    fn default() -> Self {
13        Self {
14            table: Default::default(),
15        }
16    }
17}
18
19impl<K, A> Clear for HalfJoinStateFoldFrom<K, A> {
20    fn clear(&mut self) {
21        self.table.clear()
22    }
23}
24
25impl<K, A> HalfJoinStateFoldFrom<K, A>
26where
27    K: Eq + std::hash::Hash,
28{
29    pub fn fold_into<V, X>(
30        &mut self,
31        iter: impl Iterator<Item = (K, V)>,
32        mut fold: impl FnMut(&mut A, V) -> X,
33        mut from: impl FnMut(V) -> A,
34    ) {
35        for (k, v) in iter {
36            let entry = self.table.entry(k);
37
38            match entry {
39                Occupied(mut e) => {
40                    (fold)(e.get_mut(), v);
41                }
42                Vacant(e) => {
43                    e.insert((from)(v));
44                }
45            }
46        }
47    }
48}