dfir_rs/compiled/pull/half_join_state/
fold.rs
1use std::collections::hash_map::Entry::*;
2
3use rustc_hash::FxHashMap;
4
5use crate::util::clear::Clear;
6
7pub struct HalfJoinStateFold<K, A> {
8 pub table: FxHashMap<K, A>,
9}
10
11impl<K, A> Default for HalfJoinStateFold<K, A> {
12 fn default() -> Self {
13 Self {
14 table: Default::default(),
15 }
16 }
17}
18
19impl<K, A> Clear for HalfJoinStateFold<K, A> {
20 fn clear(&mut self) {
21 self.table.clear()
22 }
23}
24
25impl<K, A> HalfJoinStateFold<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 default: impl FnMut() -> 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 (fold)(e.insert((default)()), v);
44 }
45 }
46 }
47 }
48}