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 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}