graphrecords_python/graphrecord/
traits.rs1use graphrecords_utils::aliases::GrHashMap;
2use std::{
3 collections::HashMap,
4 hash::{BuildHasher, Hash},
5};
6
7pub trait DeepFrom<T> {
8 fn deep_from(value: T) -> Self;
9}
10
11pub trait DeepInto<T> {
12 fn deep_into(self) -> T;
13}
14
15impl<T, F> DeepInto<T> for F
16where
17 T: DeepFrom<F>,
18{
19 fn deep_into(self) -> T {
20 T::deep_from(self)
21 }
22}
23
24impl<K, KF, V, VF, H> DeepFrom<HashMap<K, V>> for HashMap<KF, VF, H>
25where
26 KF: Hash + Eq + DeepFrom<K>,
27 VF: DeepFrom<V>,
28 H: BuildHasher + Default,
29{
30 fn deep_from(value: HashMap<K, V>) -> Self {
31 value
32 .into_iter()
33 .map(|(key, value)| (key.deep_into(), value.deep_into()))
34 .collect()
35 }
36}
37
38impl<K, KF, V, VF, H, H2> DeepFrom<&HashMap<K, V, H2>> for HashMap<KF, VF, H>
39where
40 K: Clone,
41 V: Clone,
42 KF: Hash + Eq + DeepFrom<K>,
43 VF: DeepFrom<V>,
44 H: BuildHasher + Default,
45 H2: BuildHasher,
46{
47 fn deep_from(value: &HashMap<K, V, H2>) -> Self {
48 value
49 .iter()
50 .map(|(key, value)| (key.clone().deep_into(), value.clone().deep_into()))
51 .collect()
52 }
53}
54
55impl<K, KF, V, VF, H> DeepFrom<GrHashMap<K, V>> for HashMap<KF, VF, H>
56where
57 KF: Hash + Eq + DeepFrom<K>,
58 VF: DeepFrom<V>,
59 H: BuildHasher + Default,
60{
61 fn deep_from(value: GrHashMap<K, V>) -> Self {
62 value
63 .into_iter()
64 .map(|(key, value)| (key.deep_into(), value.deep_into()))
65 .collect()
66 }
67}
68
69impl<K, KF, V, VF> DeepFrom<(K, V)> for (KF, VF)
70where
71 KF: DeepFrom<K>,
72 VF: DeepFrom<V>,
73{
74 fn deep_from(value: (K, V)) -> Self {
75 (value.0.deep_into(), value.1.deep_into())
76 }
77}
78
79impl<K, KF, V, VF> DeepFrom<(K, K, V)> for (KF, KF, VF)
80where
81 KF: DeepFrom<K>,
82 VF: DeepFrom<V>,
83{
84 fn deep_from(value: (K, K, V)) -> Self {
85 (
86 value.0.deep_into(),
87 value.1.deep_into(),
88 value.2.deep_into(),
89 )
90 }
91}
92
93impl<V, VF> DeepFrom<Vec<V>> for Vec<VF>
94where
95 VF: DeepFrom<V>,
96{
97 fn deep_from(value: Vec<V>) -> Self {
98 value.into_iter().map(VF::deep_from).collect()
99 }
100}
101
102impl<V, VF> DeepFrom<Option<V>> for Option<VF>
103where
104 VF: DeepFrom<V>,
105{
106 fn deep_from(value: Option<V>) -> Self {
107 value.map(DeepInto::deep_into)
108 }
109}