f1r3fly_models/rust/
par_set.rs1use crate::rhoapi::{Par, Var};
4
5use super::{sorted_par_hash_set::SortedParHashSet, utils::union};
6
7#[derive(Clone)]
8pub struct ParSet {
9 pub ps: SortedParHashSet,
10 pub connective_used: bool,
11 pub locally_free: Vec<u8>,
12 pub remainder: Option<Var>,
13}
14
15impl ParSet {
16 pub fn new(
17 vec: Vec<Par>,
18 connective_used: bool,
19 locally_free: Vec<u8>,
20 remainder: Option<Var>,
21 ) -> ParSet {
22 ParSet {
23 ps: SortedParHashSet::create_from_vec(vec),
24 connective_used,
25 locally_free,
26 remainder,
27 }
28 }
29
30 pub fn create_from_vec_and_remainder(vec: Vec<Par>, remainder: Option<Var>) -> Self {
31 let shs = SortedParHashSet::create_from_vec(vec.clone());
32 ParSet {
33 ps: shs.clone(),
34 connective_used: ParSet::connective_used(&vec) || remainder.is_some(),
35 locally_free: ParSet::update_locally_free(&shs),
36 remainder,
37 }
38 }
39
40 pub fn create_from_vec(vec: Vec<Par>) -> Self {
41 ParSet::create_from_vec_and_remainder(vec.clone(), None)
42 }
43
44 pub fn equals(&self, other: ParSet) -> bool {
45 self.ps.equals(other.ps)
46 && self.remainder == other.remainder
47 && self.connective_used == other.connective_used
48 }
49
50 fn connective_used(vec: &Vec<Par>) -> bool {
51 vec.iter().any(|p| p.connective_used)
52 }
53
54 fn update_locally_free(ps: &SortedParHashSet) -> Vec<u8> {
55 ps.sorted_pars
56 .clone()
57 .into_iter()
58 .fold(Vec::new(), |acc, p| union(acc, p.locally_free))
59 }
60}