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