mech_core/structures/
set.rs1use crate::*;
2use indexmap::set::IndexSet;
3
4#[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}