1use js::conversions::ToJSValConvertible;
8
9use crate::iterable::Iterable;
10
11pub trait Setlike {
17 type Key: ToJSValConvertible + Clone; fn get_index(&self, index: u32) -> Option<Self::Key>;
21
22 fn size(&self) -> u32;
23 fn add(&self, key: Self::Key);
24 fn has(&self, key: Self::Key) -> bool;
25 fn clear(&self);
26 fn delete(&self, key: Self::Key) -> bool;
27}
28
29impl<T: Setlike> Maplike for T {
33 type Key = <T as Setlike>::Key;
34
35 type Value = <T as Setlike>::Key;
36
37 #[inline]
38 fn get_index(&self, index: u32) -> Option<(Self::Key, Self::Value)> {
39 self.get_index(index).map(|k| (k.clone(), k))
40 }
41
42 fn get(&self, _key: Self::Key) -> Option<Self::Value> {
43 unimplemented!()
44 }
45
46 #[inline]
47 fn size(&self) -> u32 {
48 self.size()
49 }
50
51 fn set(&self, _key: Self::Key, _value: Self::Value) {
52 unimplemented!()
53 }
54
55 fn has(&self, _key: Self::Key) -> bool {
56 unimplemented!()
57 }
58
59 fn clear(&self) {
60 unimplemented!()
61 }
62
63 fn delete(&self, _key: Self::Key) -> bool {
64 unimplemented!()
65 }
66}
67
68pub trait Maplike {
75 type Key: ToJSValConvertible;
77 type Value: ToJSValConvertible;
79
80 fn get_index(&self, index: u32) -> Option<(Self::Key, Self::Value)>;
81
82 fn get(&self, key: Self::Key) -> Option<Self::Value>;
83 fn size(&self) -> u32;
84 fn set(&self, key: Self::Key, value: Self::Value);
85 fn has(&self, key: Self::Key) -> bool;
86 fn clear(&self);
87 fn delete(&self, key: Self::Key) -> bool;
88}
89
90impl<T: Maplike> Iterable for T {
91 type Key = T::Key;
92
93 type Value = T::Value;
94
95 #[inline]
96 fn get_iterable_length(&self) -> u32 {
97 self.size()
98 }
99
100 #[inline]
101 fn get_value_at_index(&self, index: u32) -> <T as Maplike>::Value {
102 self.get_index(index).unwrap().1
104 }
105
106 #[inline]
107 fn get_key_at_index(&self, index: u32) -> <T as Maplike>::Key {
108 self.get_index(index).unwrap().0
110 }
111}