mech_core/structures/
set.rs

1use crate::*;
2use indexmap::set::IndexSet;
3
4// Set --------------------------------------------------------------------------
5
6#[derive(Clone, Debug, PartialEq, Eq)]
7pub struct MechSet {
8  pub kind: ValueKind,
9  pub num_elements: usize,
10  pub set: IndexSet<Value>,
11}
12
13impl MechSet {
14
15  #[cfg(feature = "pretty_print")]
16  pub fn to_html(&self) -> String {
17    let mut src = String::new();
18    for (i, element) in self.set.iter().enumerate() {
19      let e = element.to_html();
20      if i == 0 {
21        src = format!("{}", e);
22      } else {
23        src = format!("{}, {}", src, e);
24      }
25    }
26    format!("<span class=\"mech-set\"><span class=\"mech-start-brace\">{{</span>{}<span class=\"mech-end-brace\">}}</span></span>",src)
27  }
28
29  pub fn kind(&self) -> ValueKind {
30    let size = if self.num_elements > 0 { Some(self.num_elements) } else { None };
31    ValueKind::Set(Box::new(self.kind.clone()), size)
32  }
33
34  pub fn size_of(&self) -> usize {
35    self.set.iter().map(|x| x.size_of()).sum()
36  }
37
38  pub fn from_vec(vec: Vec<Value>) -> MechSet {
39    let mut set = IndexSet::new();
40    for v in vec {
41      set.insert(v);
42    }
43    let kind = if set.len() > 0 { set.iter().next().unwrap().kind() } else { ValueKind::Empty };
44    MechSet{
45      kind,
46      num_elements: set.len(),
47      set}
48  }
49}
50
51#[cfg(feature = "pretty_print")]
52impl PrettyPrint for MechSet {
53  fn pretty_print(&self) -> String {
54    let mut builder = Builder::default();
55    let mut element_strings = vec![];
56    for x in self.set.iter() {
57      element_strings.push(x.pretty_print());
58    }
59    builder.push_record(element_strings);
60
61    let style = Style::empty()
62      .top(' ')
63      .left('║')
64      .right('║')
65      .bottom(' ')
66      .vertical(' ')
67      .intersection_bottom(' ')
68      .corner_top_left('╔')
69      .corner_top_right('╗')
70      .corner_bottom_left('╚')
71      .corner_bottom_right('╝');
72    let mut table = builder.build();
73    table.with(style);
74    format!("{table}")
75  }
76}
77
78impl Hash for MechSet {
79  fn hash<H: Hasher>(&self, state: &mut H) {
80    for x in self.set.iter() {
81      x.hash(state)
82    }
83  }
84}