binius_m3/
emulate.rs
1use std::{collections::HashMap, hash::Hash};
4
5#[derive(Debug, Default)]
7pub struct Channel<T> {
8 net_multiplicities: HashMap<T, isize>,
9}
10
11impl<T: Hash + Eq> Channel<T> {
12 pub fn push(&mut self, val: T) {
13 match self.net_multiplicities.get_mut(&val) {
14 Some(multiplicity) => {
15 *multiplicity += 1;
16
17 if *multiplicity == 0 {
19 self.net_multiplicities.remove(&val);
20 }
21 }
22 None => {
23 let _ = self.net_multiplicities.insert(val, 1);
24 }
25 }
26 }
27
28 pub fn pull(&mut self, val: T) {
29 match self.net_multiplicities.get_mut(&val) {
30 Some(multiplicity) => {
31 *multiplicity -= 1;
32
33 if *multiplicity == 0 {
35 self.net_multiplicities.remove(&val);
36 }
37 }
38 None => {
39 let _ = self.net_multiplicities.insert(val, -1);
40 }
41 }
42 }
43
44 pub fn is_balanced(&self) -> bool {
45 self.net_multiplicities.is_empty()
46 }
47}