1
use bimap::hash::{Iter, LeftValues, RightValues};
2
use bimap::{BiHashMap, Overwritten};
3
use derivative::Derivative;
4
use funcmap::{FuncMap, TryFuncMap, TypeParam};
5
use polyquine::Quine;
6
use proc_macro2::TokenStream;
7
use quote::quote;
8
use serde::{Deserialize, Deserializer, Serialize, Serializer};
9
use serde_with::de::DeserializeAsWrap;
10
use serde_with::ser::SerializeAsWrap;
11
use serde_with::serde_as;
12
use serde_with::{DeserializeAs, SerializeAs};
13
use std::borrow::Borrow;
14
use std::hash::Hash;
15

            
16
#[serde_as]
17
#[derive(Debug, Derivative)]
18
#[derivative(Clone(bound = "L: Clone + Eq + Hash, R: Clone + Eq + Hash"))]
19
#[derivative(Default(bound = "L: Default + Eq + Hash, R: Default + Eq + Hash"))]
20
#[derivative(PartialEq(bound = "L: Eq + Hash, R: Eq + Hash"))]
21
#[derivative(Eq(bound = "L: Eq + Hash, R: Eq + Hash"))]
22
pub struct BiMap<L, R> {
23
    inner: BiHashMap<L, R>,
24
}
25

            
26
impl<L, R> BiMap<L, R>
27
where
28
    L: Eq + Hash,
29
    R: Eq + Hash,
30
{
31
    pub fn new() -> Self {
32
        Self {
33
            inner: BiHashMap::new(),
34
        }
35
    }
36

            
37
143
    pub fn with_capacity(capacity: usize) -> Self {
38
143
        Self {
39
143
            inner: BiHashMap::with_capacity(capacity),
40
143
        }
41
143
    }
42

            
43
45704
    pub fn get_by_left<Q>(&self, left: &Q) -> Option<&R>
44
45704
    where
45
45704
        L: Borrow<Q>,
46
45704
        Q: Eq + Hash + ?Sized,
47
    {
48
45704
        self.inner.get_by_left(left)
49
45704
    }
50

            
51
2563297
    pub fn get_by_right<Q>(&self, right: &Q) -> Option<&L>
52
2563297
    where
53
2563297
        R: Borrow<Q>,
54
2563297
        Q: Eq + Hash + ?Sized,
55
    {
56
2563297
        self.inner.get_by_right(right)
57
2563297
    }
58

            
59
    pub fn contains_left<Q>(&self, left: &Q) -> bool
60
    where
61
        L: Borrow<Q>,
62
        Q: Eq + Hash + ?Sized,
63
    {
64
        self.inner.contains_left(left)
65
    }
66

            
67
    pub fn contains_right<Q>(&self, right: &Q) -> bool
68
    where
69
        R: Borrow<Q>,
70
        Q: Eq + Hash + ?Sized,
71
    {
72
        self.inner.contains_right(right)
73
    }
74

            
75
    pub fn remove_by_left<Q>(&mut self, left: &Q) -> Option<(L, R)>
76
    where
77
        L: Borrow<Q>,
78
        Q: Eq + Hash + ?Sized,
79
    {
80
        self.inner.remove_by_left(left)
81
    }
82

            
83
    pub fn remove_by_right<Q>(&mut self, right: &Q) -> Option<(L, R)>
84
    where
85
        R: Borrow<Q>,
86
        Q: Eq + Hash + ?Sized,
87
    {
88
        self.inner.remove_by_right(right)
89
    }
90

            
91
286
    pub fn insert(&mut self, left: L, right: R) -> Overwritten<L, R> {
92
286
        self.inner.insert(left, right)
93
286
    }
94

            
95
    pub fn insert_no_overwrite(&mut self, left: L, right: R) -> Result<(), (L, R)> {
96
        self.inner.insert_no_overwrite(left, right)
97
    }
98

            
99
    pub fn retain<F>(&mut self, f: F)
100
    where
101
        F: FnMut(&L, &R) -> bool,
102
    {
103
        self.inner.retain(f)
104
    }
105

            
106
    pub fn len(&self) -> usize {
107
        self.inner.len()
108
    }
109

            
110
    pub fn is_empty(&self) -> bool {
111
        self.inner.is_empty()
112
    }
113

            
114
    pub fn clear(&mut self) {
115
        self.inner.clear()
116
    }
117

            
118
    pub fn iter(&self) -> Iter<'_, L, R> {
119
        self.inner.iter()
120
    }
121

            
122
    pub fn left_values(&self) -> LeftValues<'_, L, R> {
123
        self.inner.left_values()
124
    }
125

            
126
    pub fn right_values(&self) -> RightValues<'_, L, R> {
127
        self.inner.right_values()
128
    }
129
}
130

            
131
impl<L, R> IntoIterator for BiMap<L, R>
132
where
133
    L: Eq + Hash,
134
    R: Eq + Hash,
135
{
136
    type Item = (L, R);
137
    type IntoIter = <BiHashMap<L, R> as IntoIterator>::IntoIter;
138

            
139
    fn into_iter(self) -> Self::IntoIter {
140
        self.inner.into_iter()
141
    }
142
}
143

            
144
impl<L, R> FromIterator<(L, R)> for BiMap<L, R>
145
where
146
    L: Eq + Hash,
147
    R: Eq + Hash,
148
{
149
3841
    fn from_iter<T: IntoIterator<Item = (L, R)>>(iter: T) -> Self {
150
3841
        Self {
151
3841
            inner: BiHashMap::from_iter(iter),
152
3841
        }
153
3841
    }
154
}
155

            
156
impl<L, R, const N: usize> From<[(L, R); N]> for BiMap<L, R>
157
where
158
    L: Eq + Hash,
159
    R: Eq + Hash,
160
{
161
    fn from(v: [(L, R); N]) -> Self {
162
        Self::from_iter(v)
163
    }
164
}
165

            
166
impl<L, R> Serialize for BiMap<L, R>
167
where
168
    L: Eq + Hash + Serialize,
169
    R: Eq + Hash + Serialize,
170
{
171
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
172
    where
173
        S: Serializer,
174
    {
175
        // Serialize as a list of pairs rather than as a map, so that non-string
176
        // key types (e.g. usize) work with JSON serializers.
177
        let entries: Vec<(&L, &R)> = self.inner.iter().collect();
178
        entries.serialize(serializer)
179
    }
180
}
181

            
182
impl<'de, L, R> Deserialize<'de> for BiMap<L, R>
183
where
184
    L: Eq + Hash + Deserialize<'de>,
185
    R: Eq + Hash + Deserialize<'de>,
186
{
187
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
188
    where
189
        D: Deserializer<'de>,
190
    {
191
        let entries: Vec<(L, R)> = Vec::deserialize(deserializer)?;
192
        Ok(Self {
193
            inner: entries.into_iter().collect(),
194
        })
195
    }
196
}
197

            
198
impl<L, R, LAs, RAs> SerializeAs<BiMap<L, R>> for BiMap<LAs, RAs>
199
where
200
    L: Eq + Hash,
201
    L: Serialize,
202
    R: Eq + Hash,
203
    LAs: SerializeAs<L>,
204
    RAs: SerializeAs<R>,
205
{
206
    fn serialize_as<S>(source: &BiMap<L, R>, serializer: S) -> Result<S::Ok, S::Error>
207
    where
208
        S: serde::Serializer,
209
    {
210
        let entries = source
211
            .iter()
212
            .map(|(left, right)| {
213
                (
214
                    SerializeAsWrap::<L, LAs>::new(left),
215
                    SerializeAsWrap::<R, RAs>::new(right),
216
                )
217
            })
218
            .collect::<Vec<_>>();
219
        entries.serialize(serializer)
220
    }
221
}
222

            
223
impl<'de, L, R, LAs, RAs> DeserializeAs<'de, BiMap<L, R>> for BiMap<LAs, RAs>
224
where
225
    L: Eq + Hash,
226
    R: Eq + Hash,
227
    L: Deserialize<'de>,
228
    LAs: DeserializeAs<'de, L>,
229
    RAs: DeserializeAs<'de, R>,
230
{
231
    fn deserialize_as<D>(deserializer: D) -> Result<BiMap<L, R>, D::Error>
232
    where
233
        D: serde::Deserializer<'de>,
234
    {
235
        let entries: Vec<(DeserializeAsWrap<L, LAs>, DeserializeAsWrap<R, RAs>)> =
236
            Vec::deserialize(deserializer)?;
237

            
238
        Ok(entries
239
            .into_iter()
240
            .map(|(left, right)| (left.into_inner(), right.into_inner()))
241
            .collect())
242
    }
243
}
244

            
245
impl<L, R, NewL> FuncMap<L, NewL, TypeParam<0>> for BiMap<L, R>
246
where
247
    L: Eq + Hash,
248
    R: Eq + Hash,
249
    NewL: Eq + Hash,
250
{
251
    type Output = BiMap<NewL, R>;
252

            
253
    fn func_map<F>(self, mut f: F) -> Self::Output
254
    where
255
        F: FnMut(L) -> NewL,
256
    {
257
        let itr = self.into_iter().map(|(k, v)| (f(k), v));
258
        Self::Output::from_iter(itr)
259
    }
260
}
261

            
262
impl<L, R, NewR> FuncMap<R, NewR, TypeParam<1>> for BiMap<L, R>
263
where
264
    L: Eq + Hash,
265
    R: Eq + Hash,
266
    NewR: Eq + Hash,
267
{
268
    type Output = BiMap<L, NewR>;
269

            
270
    fn func_map<F>(self, mut f: F) -> Self::Output
271
    where
272
        F: FnMut(R) -> NewR,
273
    {
274
        let itr = self.into_iter().map(|(k, v)| (k, f(v)));
275
        Self::Output::from_iter(itr)
276
    }
277
}
278

            
279
impl<L, R, NewL> TryFuncMap<L, NewL, TypeParam<0>> for BiMap<L, R>
280
where
281
    L: Eq + Hash,
282
    R: Eq + Hash,
283
    NewL: Eq + Hash,
284
{
285
    type Output = BiMap<NewL, R>;
286

            
287
    fn try_func_map<E, F>(self, mut f: F) -> Result<Self::Output, E>
288
    where
289
        F: FnMut(L) -> Result<NewL, E>,
290
    {
291
        let pairs: Result<Vec<(NewL, R)>, E> =
292
            self.into_iter().map(|(k, v)| Ok((f(k)?, v))).collect();
293

            
294
        Ok(Self::Output::from_iter(pairs?))
295
    }
296
}
297

            
298
impl<L, R, NewR> TryFuncMap<R, NewR, TypeParam<1>> for BiMap<L, R>
299
where
300
    L: Eq + Hash,
301
    R: Eq + Hash,
302
    NewR: Eq + Hash,
303
{
304
    type Output = BiMap<L, NewR>;
305

            
306
    fn try_func_map<E, F>(self, mut f: F) -> Result<Self::Output, E>
307
    where
308
        F: FnMut(R) -> Result<NewR, E>,
309
    {
310
        let pairs: Result<Vec<(L, NewR)>, E> =
311
            self.into_iter().map(|(k, v)| Ok((k, f(v)?))).collect();
312

            
313
        Ok(Self::Output::from_iter(pairs?))
314
    }
315
}
316

            
317
impl<L: Quine, R: Quine> Quine for BiMap<L, R>
318
where
319
    L: Eq + Hash,
320
    R: Eq + Hash,
321
{
322
    fn ctor_tokens(&self) -> TokenStream {
323
        let inner = self
324
            .iter()
325
            .map(|item| item.ctor_tokens())
326
            .collect::<Vec<_>>();
327
        quote! {
328
            BiMap::from([#(#inner),*])
329
        }
330
    }
331
}