cml_core/
ordered_hash_map.rs1use core::hash::{Hash, Hasher};
2use std::iter::FromIterator;
3
4#[allow(clippy::derived_hash_with_manual_eq)]
6#[derive(Clone, Debug, Ord, Eq, PartialEq, PartialOrd)]
7pub struct OrderedHashMap<K, V>(linked_hash_map::LinkedHashMap<K, V>)
8where
9 K: Hash + Eq + Ord;
10
11impl<K, V> Default for OrderedHashMap<K, V>
12where
13 K: Hash + Eq + Ord,
14{
15 fn default() -> Self {
16 Self::new()
17 }
18}
19
20impl<K, V> std::ops::Deref for OrderedHashMap<K, V>
21where
22 K: Hash + Eq + Ord,
23{
24 type Target = linked_hash_map::LinkedHashMap<K, V>;
25
26 fn deref(&self) -> &Self::Target {
27 &self.0
28 }
29}
30
31impl<K, V> std::ops::DerefMut for OrderedHashMap<K, V>
32where
33 K: Hash + Eq + Ord,
34{
35 fn deref_mut(&mut self) -> &mut Self::Target {
36 &mut self.0
37 }
38}
39
40impl<K, V> OrderedHashMap<K, V>
41where
42 K: Hash + Eq + Ord,
43{
44 pub fn new() -> Self {
45 Self(linked_hash_map::LinkedHashMap::new())
46 }
47
48 pub fn take(self) -> linked_hash_map::LinkedHashMap<K, V> {
49 self.0
50 }
51}
52
53#[allow(clippy::derived_hash_with_manual_eq)]
54impl<K, V> Hash for OrderedHashMap<K, V>
55where
56 K: Hash + Eq + Ord,
57 V: Hash,
58{
59 fn hash<H: Hasher>(&self, h: &mut H) {
60 self.0.hash(h);
61 }
62}
63
64impl<K, V> serde::Serialize for OrderedHashMap<K, V>
65where
66 K: Hash + Eq + Ord + serde::Serialize,
67 V: serde::Serialize,
68{
69 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
70 where
71 S: serde::Serializer,
72 {
73 let map = self.iter().collect::<std::collections::BTreeMap<_, _>>();
74 map.serialize(serializer)
75 }
76}
77
78impl<'de, K, V> serde::de::Deserialize<'de> for OrderedHashMap<K, V>
79where
80 K: Hash + Eq + Ord + serde::Deserialize<'de>,
81 V: serde::Deserialize<'de>,
82{
83 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
84 where
85 D: serde::de::Deserializer<'de>,
86 {
87 let map = <std::collections::BTreeMap<_, _> as serde::de::Deserialize>::deserialize(
88 deserializer,
89 )?;
90 Ok(Self(map.into_iter().collect()))
91 }
92}
93
94impl<K, V> schemars::JsonSchema for OrderedHashMap<K, V>
95where
96 K: Hash + Eq + Ord + schemars::JsonSchema,
97 V: schemars::JsonSchema,
98{
99 fn schema_name() -> String {
100 format!("OrderedHashMap<{}, {}>", K::schema_name(), V::schema_name())
101 }
102 fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
103 std::collections::BTreeMap::<K, V>::json_schema(gen)
104 }
105 fn is_referenceable() -> bool {
106 std::collections::BTreeMap::<K, V>::is_referenceable()
107 }
108}
109
110impl<K, V> FromIterator<(K, V)> for OrderedHashMap<K, V>
111where
112 K: Hash + Eq + Ord,
113{
114 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
115 Self(linked_hash_map::LinkedHashMap::from_iter(iter))
116 }
117}