Skip to main content

f1r3fly_models/rust/
par_set.rs

1// See models/src/main/scala/coop/rchain/models/ParSet.scala
2
3use 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}