Skip to main content

graphrecords_python/graphrecord/
traits.rs

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