thedes_geometry/collections/
map.rs

1use std::{
2    borrow::Borrow,
3    cmp::Ordering,
4    collections::{BTreeMap, btree_map},
5    fmt,
6    hash::{Hash, Hasher},
7    marker::PhantomData,
8    mem,
9    ops::Bound,
10};
11
12use serde::{
13    Deserialize,
14    Deserializer,
15    Serialize,
16    Serializer,
17    de::{MapAccess, Visitor},
18    ser::SerializeMap,
19};
20
21use crate::{
22    CoordPair,
23    coords::{CoordPairBounds, CoordRange},
24    orientation::Axis,
25};
26
27#[cfg(test)]
28mod test;
29
30#[derive(Debug, Clone)]
31pub struct CoordMap<K, V> {
32    len: usize,
33    inner: CoordPair<BTreeMap<K, BTreeMap<K, V>>>,
34}
35
36impl<K, V> Default for CoordMap<K, V> {
37    fn default() -> Self {
38        Self::new()
39    }
40}
41
42impl<K, V> CoordMap<K, V> {
43    pub fn new() -> Self {
44        Self { len: 0, inner: CoordPair::from_axes(|_| BTreeMap::new()) }
45    }
46
47    pub fn len(&self) -> usize {
48        self.len
49    }
50
51    pub fn is_empty(&self) -> bool {
52        self.len() == 0
53    }
54}
55
56impl<K, V> CoordMap<K, V>
57where
58    K: Ord,
59{
60    pub fn contains_key<Q>(&self, key: CoordPair<&Q>) -> bool
61    where
62        K: Borrow<Q>,
63        Q: Ord,
64    {
65        self.get(key).is_some()
66    }
67
68    pub fn get<Q>(&self, key: CoordPair<&Q>) -> Option<&V>
69    where
70        K: Borrow<Q>,
71        Q: Ord,
72    {
73        let (_, value) = self.get_key_value(key)?;
74        Some(value)
75    }
76
77    pub fn get_key_value<Q>(
78        &self,
79        key: CoordPair<&Q>,
80    ) -> Option<(CoordPair<&K>, &V)>
81    where
82        K: Borrow<Q>,
83        Q: Ord,
84    {
85        let (key_y, entry) = self.inner.y.get_key_value(key.y)?;
86        let (key_x, value) = entry.get_key_value(key.x)?;
87        Some((CoordPair { y: key_y, x: key_x }, value))
88    }
89}
90
91impl<K, V> CoordMap<K, V>
92where
93    K: Ord,
94    V: Clone,
95{
96    pub fn with_mut<Q, F, T>(
97        &mut self,
98        key: CoordPair<&Q>,
99        modifier: F,
100    ) -> Option<T>
101    where
102        K: Borrow<Q>,
103        Q: Ord,
104        F: FnOnce(&mut V) -> T,
105    {
106        let entry_ref = self.inner.y.get_mut(key.y)?.get_mut(key.x)?;
107        let output = modifier(entry_ref);
108        let value = entry_ref.clone();
109        let entry_ref = self
110            .inner
111            .x
112            .get_mut(key.x)
113            .and_then(|entry| entry.get_mut(key.y))
114            .expect("The coord map should be mirrored (with_mut xy)");
115        *entry_ref = value;
116        Some(output)
117    }
118}
119
120impl<K, V> CoordMap<K, V>
121where
122    K: Ord + Clone,
123    V: Clone,
124{
125    pub fn insert(&mut self, key: CoordPair<K>, value: V) -> Option<V> {
126        match self.entry(key) {
127            Entry::Vacant(entry) => {
128                entry.insert(value);
129                None
130            },
131            Entry::Occupied(mut entry) => Some(entry.insert(value)),
132        }
133    }
134}
135
136impl<K, V> CoordMap<K, V>
137where
138    K: Ord,
139{
140    pub fn remove_entry<Q>(
141        &mut self,
142        key: CoordPair<&Q>,
143    ) -> Option<(CoordPair<K>, V)>
144    where
145        K: Borrow<Q>,
146        Q: Ord,
147    {
148        let yx_tree = self.inner.y.get_mut(key.y)?;
149        let (key_x, value) = yx_tree.remove_entry(key.x)?;
150        self.len -= 1;
151        if yx_tree.is_empty() {
152            self.inner.y.remove(key.y);
153        }
154        let xy_tree = self.inner.x.get_mut(key.x).expect(
155            "The coord map should be mirrored (remove_entry get_mut xy)",
156        );
157        let (key_y, _) = xy_tree
158            .remove_entry(key.y)
159            .expect("The coord map should be mirrored (remove_entry xy)");
160        if xy_tree.is_empty() {
161            self.inner.x.remove(key.x);
162        }
163        Some((CoordPair { y: key_y, x: key_x }, value))
164    }
165
166    pub fn remove<Q>(&mut self, key: CoordPair<&Q>) -> Option<V>
167    where
168        K: Borrow<Q>,
169        Q: Ord,
170    {
171        let (_, value) = self.remove_entry(key)?;
172        Some(value)
173    }
174}
175
176impl<K, V> CoordMap<K, V>
177where
178    K: Ord + Clone,
179{
180    pub fn entry(&mut self, key: CoordPair<K>) -> Entry<K, V> {
181        match self
182            .inner
183            .as_mut()
184            .zip2_with(key.clone(), |inner, key| inner.entry(key))
185        {
186            CoordPair {
187                y: btree_map::Entry::Occupied(y_entry),
188                x: btree_map::Entry::Occupied(x_entry),
189            } => {
190                let is_occupied = y_entry.get().contains_key(&key.x);
191                let entries = CoordPair { y: y_entry, x: x_entry };
192                if is_occupied {
193                    Entry::Occupied(OccupiedEntry {
194                        len: &mut self.len,
195                        entries,
196                    })
197                } else {
198                    Entry::Vacant(VacantEntry {
199                        len: &mut self.len,
200                        inner: VacantEntryInner::BothNested {
201                            key,
202                            top_level: entries,
203                        },
204                    })
205                }
206            },
207
208            CoordPair {
209                y: btree_map::Entry::Vacant(y_entry),
210                x: btree_map::Entry::Vacant(x_entry),
211            } => Entry::Vacant(VacantEntry {
212                len: &mut self.len,
213                inner: VacantEntryInner::BothTopLevel(CoordPair {
214                    y: y_entry,
215                    x: x_entry,
216                }),
217            }),
218
219            CoordPair {
220                y: btree_map::Entry::Occupied(y_entry),
221                x: btree_map::Entry::Vacant(x_entry),
222            } => Entry::Vacant(VacantEntry {
223                len: &mut self.len,
224                inner: VacantEntryInner::OneNested {
225                    selected_axis: Axis::Y,
226                    selected_key: key.y,
227                    selected_nested: y_entry.into_mut().entry(key.x),
228                    unselected_top_level: x_entry,
229                },
230            }),
231
232            CoordPair {
233                y: btree_map::Entry::Vacant(y_entry),
234                x: btree_map::Entry::Occupied(x_entry),
235            } => Entry::Vacant(VacantEntry {
236                len: &mut self.len,
237                inner: VacantEntryInner::OneNested {
238                    selected_axis: Axis::X,
239                    selected_key: key.x,
240                    selected_nested: x_entry.into_mut().entry(key.y),
241                    unselected_top_level: y_entry,
242                },
243            }),
244        }
245    }
246}
247
248impl<K, V> CoordMap<K, V>
249where
250    K: Ord,
251{
252    pub fn range<'q, 'a, R, Q>(
253        &'a self,
254        higher_axis: Axis,
255        ranges: R,
256    ) -> Range<'q, 'a, Q, K, V>
257    where
258        R: Into<CoordPairBounds<&'q Q>>,
259        K: Borrow<Q>,
260        Q: Ord + 'q,
261    {
262        let (outer_range, (inner_range_start, inner_range_end)) =
263            ranges.into().shift_rev_to(higher_axis).into_order();
264        let inner_range = (inner_range_start, inner_range_end);
265        let mut outer = self.inner[higher_axis].range(outer_range);
266        let inner_front =
267            outer.next().map(|(key, tree)| (key, tree.range(inner_range)));
268        let inner_back =
269            outer.next_back().map(|(key, tree)| (key, tree.range(inner_range)));
270        Range {
271            higher_axis,
272            inner_range_start,
273            inner_range_end,
274            outer,
275            inner_front,
276            inner_back,
277        }
278    }
279
280    pub fn next_neighbor<Q>(
281        &self,
282        axis: Axis,
283        key: CoordPair<&Q>,
284    ) -> Option<(CoordPair<&K>, &V)>
285    where
286        K: Borrow<Q>,
287        Q: Ord,
288    {
289        let (first_key, second_key) = key.shift_rev_to(axis).into_order();
290        let range = CoordRange::with_order(
291            (Bound::Excluded(first_key), Bound::Unbounded),
292            second_key ..= second_key,
293        );
294        let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
295        iter.next()
296    }
297
298    pub fn last_neighbor<Q>(
299        &self,
300        axis: Axis,
301        key: CoordPair<&Q>,
302    ) -> Option<(CoordPair<&K>, &V)>
303    where
304        K: Borrow<Q>,
305        Q: Ord,
306    {
307        let (first_key, second_key) = key.shift_rev_to(axis).into_order();
308        let range = CoordRange::with_order(
309            (Bound::Excluded(first_key), Bound::Unbounded),
310            second_key ..= second_key,
311        );
312        let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
313        iter.next_back()
314    }
315
316    pub fn prev_neighbor<Q>(
317        &self,
318        axis: Axis,
319        key: CoordPair<&Q>,
320    ) -> Option<(CoordPair<&K>, &V)>
321    where
322        K: Borrow<Q>,
323        Q: Ord,
324    {
325        let (first_key, second_key) = key.shift_rev_to(axis).into_order();
326        let range =
327            CoordRange::with_order(.. first_key, second_key ..= second_key);
328        let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
329        iter.next_back()
330    }
331
332    pub fn first_neighbor<Q>(
333        &self,
334        axis: Axis,
335        key: CoordPair<&Q>,
336    ) -> Option<(CoordPair<&K>, &V)>
337    where
338        K: Borrow<Q>,
339        Q: Ord,
340    {
341        let (first_key, second_key) = key.shift_rev_to(axis).into_order();
342        let range =
343            CoordRange::with_order(.. first_key, second_key ..= second_key);
344        let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
345        iter.next()
346    }
347}
348
349impl<K, V> CoordMap<K, V> {
350    pub fn iter(&self, higher_axis: Axis) -> Iter<K, V> {
351        let mut outer = self.inner[higher_axis].iter();
352        let inner_front = outer.next().map(|(key, tree)| (key, tree.iter()));
353        let inner_back =
354            outer.next_back().map(|(key, tree)| (key, tree.iter()));
355        Iter { axis: higher_axis, outer, inner_front, inner_back }
356    }
357
358    pub fn rows(&self) -> Iter<K, V> {
359        self.iter(Axis::Y)
360    }
361
362    pub fn columns(&self) -> Iter<K, V> {
363        self.iter(Axis::X)
364    }
365
366    pub fn keys(&self, higher_axis: Axis) -> Keys<K, V> {
367        Keys { inner: self.iter(higher_axis) }
368    }
369
370    pub fn key_rows(&self) -> Keys<K, V> {
371        self.keys(Axis::Y)
372    }
373
374    pub fn key_columns(&self) -> Keys<K, V> {
375        self.keys(Axis::X)
376    }
377
378    pub fn values(&self, higher_axis: Axis) -> Values<K, V> {
379        Values { inner: self.iter(higher_axis) }
380    }
381
382    pub fn value_rows(&self) -> Values<K, V> {
383        self.values(Axis::Y)
384    }
385
386    pub fn value_columns(&self) -> Values<K, V> {
387        self.values(Axis::X)
388    }
389}
390
391impl<K, V> CoordMap<K, V>
392where
393    K: Clone,
394{
395    pub fn into_iter_with(self, higher_axis: Axis) -> IntoIter<K, V> {
396        let mut outer = self.inner.extract(higher_axis).into_iter();
397        let inner_front =
398            outer.next().map(|(key, tree)| (key, tree.into_iter()));
399        let inner_back =
400            outer.next_back().map(|(key, tree)| (key, tree.into_iter()));
401        IntoIter { axis: higher_axis, outer, inner_front, inner_back }
402    }
403
404    pub fn into_rows(self) -> IntoIter<K, V> {
405        self.into_iter_with(Axis::Y)
406    }
407
408    pub fn into_columns(self) -> IntoIter<K, V> {
409        self.into_iter_with(Axis::X)
410    }
411
412    pub fn into_keys(self, higher_axis: Axis) -> IntoKeys<K, V> {
413        IntoKeys { inner: self.into_iter_with(higher_axis) }
414    }
415
416    pub fn into_key_rows(self) -> IntoKeys<K, V> {
417        self.into_keys(Axis::Y)
418    }
419
420    pub fn into_key_columns(self) -> IntoKeys<K, V> {
421        self.into_keys(Axis::X)
422    }
423}
424
425impl<K, V> CoordMap<K, V> {
426    pub fn into_values(self, higher_axis: Axis) -> IntoValues<K, V> {
427        let mut outer = self.inner.extract(higher_axis).into_values();
428        let inner_front = outer.next().map(BTreeMap::into_values);
429        let inner_back = outer.next_back().map(BTreeMap::into_values);
430        IntoValues { outer, inner_front, inner_back }
431    }
432
433    pub fn into_value_rows(self) -> IntoValues<K, V> {
434        self.into_values(Axis::Y)
435    }
436
437    pub fn into_value_columns(self) -> IntoValues<K, V> {
438        self.into_values(Axis::X)
439    }
440}
441
442impl<K, V> PartialEq for CoordMap<K, V>
443where
444    K: PartialEq,
445    V: PartialEq,
446{
447    fn eq(&self, other: &Self) -> bool {
448        self.rows().eq(other.rows())
449    }
450}
451
452impl<K, V> Eq for CoordMap<K, V>
453where
454    K: Eq,
455    V: Eq,
456{
457}
458
459impl<K, V> PartialOrd for CoordMap<K, V>
460where
461    K: PartialOrd,
462    V: PartialOrd,
463{
464    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
465        self.rows().partial_cmp(other.rows())
466    }
467}
468
469impl<K, V> Ord for CoordMap<K, V>
470where
471    K: Ord,
472    V: Ord,
473{
474    fn cmp(&self, other: &Self) -> Ordering {
475        self.rows().cmp(other.rows())
476    }
477}
478
479impl<K, V> Hash for CoordMap<K, V>
480where
481    K: Hash,
482    V: Hash,
483{
484    fn hash<H>(&self, state: &mut H)
485    where
486        H: Hasher,
487    {
488        state.write_usize(self.len());
489        for (key, value) in self.rows() {
490            key.hash(state);
491            value.hash(state);
492        }
493    }
494}
495
496impl<K, V> Serialize for CoordMap<K, V>
497where
498    K: Serialize,
499    V: Serialize,
500{
501    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
502    where
503        S: Serializer,
504    {
505        let mut map_serializer = serializer.serialize_map(Some(self.len()))?;
506        for (key, value) in self.rows() {
507            map_serializer.serialize_entry(&key, value)?;
508        }
509        map_serializer.end()
510    }
511}
512
513impl<'de, K, V> Deserialize<'de> for CoordMap<K, V>
514where
515    K: Deserialize<'de> + Ord + Clone,
516    V: Deserialize<'de> + Clone,
517{
518    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
519    where
520        D: Deserializer<'de>,
521    {
522        struct CoordMapVisitor<K0, V0> {
523            _marker: PhantomData<(CoordPair<K0>, V0)>,
524        }
525
526        impl<'de0, K0, V0> Visitor<'de0> for CoordMapVisitor<K0, V0>
527        where
528            K0: Deserialize<'de0> + Ord + Clone,
529            V0: Deserialize<'de0> + Clone,
530        {
531            type Value = CoordMap<K0, V0>;
532
533            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
534                write!(formatter, "a coordinate map")
535            }
536
537            fn visit_map<A>(
538                self,
539                mut access: A,
540            ) -> Result<Self::Value, A::Error>
541            where
542                A: MapAccess<'de0>,
543            {
544                let mut map = CoordMap::new();
545                while let Some((key, value)) = access.next_entry()? {
546                    map.insert(key, value);
547                }
548                Ok(map)
549            }
550        }
551
552        deserializer.deserialize_map(CoordMapVisitor { _marker: PhantomData })
553    }
554}
555
556impl<'a, K, V> IntoIterator for &'a CoordMap<K, V> {
557    type Item = (CoordPair<&'a K>, &'a V);
558    type IntoIter = Iter<'a, K, V>;
559
560    fn into_iter(self) -> Self::IntoIter {
561        self.rows()
562    }
563}
564
565impl<K, V> IntoIterator for CoordMap<K, V>
566where
567    K: Clone,
568{
569    type Item = (CoordPair<K>, V);
570    type IntoIter = IntoIter<K, V>;
571
572    fn into_iter(self) -> Self::IntoIter {
573        self.into_rows()
574    }
575}
576
577enum VacantEntryInner<'a, K, V> {
578    BothTopLevel(CoordPair<btree_map::VacantEntry<'a, K, BTreeMap<K, V>>>),
579    BothNested {
580        key: CoordPair<K>,
581        top_level: CoordPair<btree_map::OccupiedEntry<'a, K, BTreeMap<K, V>>>,
582    },
583    OneNested {
584        selected_axis: Axis,
585        selected_key: K,
586        selected_nested: btree_map::Entry<'a, K, V>,
587        unselected_top_level: btree_map::VacantEntry<'a, K, BTreeMap<K, V>>,
588    },
589}
590
591impl<'a, K, V> VacantEntryInner<'a, K, V>
592where
593    K: Ord,
594{
595    pub fn key(&self) -> CoordPair<&K> {
596        match self {
597            Self::BothTopLevel(entries) => {
598                entries.as_ref().map(btree_map::VacantEntry::key)
599            },
600
601            Self::BothNested { key, .. } => key.as_ref(),
602
603            Self::OneNested {
604                selected_key,
605                unselected_top_level,
606                selected_axis,
607                ..
608            } => {
609                CoordPair::with_order(selected_key, unselected_top_level.key())
610                    .shift_to(*selected_axis)
611            },
612        }
613    }
614
615    pub fn into_key(self) -> CoordPair<K> {
616        match self {
617            Self::BothTopLevel(entries) => {
618                entries.map(btree_map::VacantEntry::into_key)
619            },
620
621            Self::BothNested { key, .. } => key,
622
623            Self::OneNested {
624                selected_axis,
625                selected_key,
626                unselected_top_level,
627                ..
628            } => CoordPair::with_order(
629                selected_key,
630                unselected_top_level.into_key(),
631            )
632            .shift_to(selected_axis),
633        }
634    }
635
636    pub fn insert(self, value: V) -> &'a V
637    where
638        K: Clone,
639        V: Clone,
640    {
641        match self {
642            Self::BothTopLevel(entries) => {
643                let key = CoordPair {
644                    y: entries.y.key().clone(),
645                    x: entries.x.key().clone(),
646                };
647                entries
648                    .y
649                    .insert(BTreeMap::new())
650                    .entry(key.x)
651                    .or_insert(value.clone());
652                let entry_ref = entries
653                    .x
654                    .insert(BTreeMap::new())
655                    .entry(key.y)
656                    .or_insert(value);
657                &*entry_ref
658            },
659
660            Self::BothNested { top_level, key } => {
661                top_level.y.into_mut().entry(key.x).or_insert(value.clone());
662                let entry_ref =
663                    top_level.x.into_mut().entry(key.y).or_insert(value);
664                &*entry_ref
665            },
666
667            Self::OneNested {
668                selected_key,
669                selected_nested,
670                unselected_top_level,
671                ..
672            } => {
673                match selected_nested {
674                    btree_map::Entry::Vacant(entry) => {
675                        entry.insert(value.clone());
676                    },
677                    btree_map::Entry::Occupied(mut entry) => {
678                        entry.insert(value.clone());
679                    },
680                }
681                let entry_ref = unselected_top_level
682                    .insert(BTreeMap::new())
683                    .entry(selected_key)
684                    .or_insert(value);
685                &*entry_ref
686            },
687        }
688    }
689}
690
691pub struct VacantEntry<'a, K, V> {
692    len: &'a mut usize,
693    inner: VacantEntryInner<'a, K, V>,
694}
695
696impl<'a, K, V> VacantEntry<'a, K, V>
697where
698    K: Ord,
699{
700    pub fn key(&self) -> CoordPair<&K> {
701        self.inner.key()
702    }
703
704    pub fn into_key(self) -> CoordPair<K> {
705        self.inner.into_key()
706    }
707
708    pub fn insert(self, value: V) -> &'a V
709    where
710        V: Clone,
711        K: Clone,
712    {
713        *self.len += 1;
714        self.inner.insert(value)
715    }
716}
717
718pub struct OccupiedEntry<'a, K, V> {
719    len: &'a mut usize,
720    entries: CoordPair<btree_map::OccupiedEntry<'a, K, BTreeMap<K, V>>>,
721}
722
723impl<'a, K, V> OccupiedEntry<'a, K, V>
724where
725    K: Ord,
726{
727    pub fn key(&self) -> CoordPair<&K> {
728        self.entries.as_ref().map(btree_map::OccupiedEntry::key)
729    }
730
731    pub fn remove_entry(mut self) -> (CoordPair<K>, V)
732    where
733        K: Clone,
734    {
735        *self.len -= 1;
736        let value = self.entries.y.get_mut().remove(self.entries.x.key());
737        self.entries.x.get_mut().remove(self.entries.y.key());
738        let keys = self.entries.map(|entry| {
739            if entry.get().is_empty() {
740                let (key, _) = entry.remove_entry();
741                key
742            } else {
743                entry.key().clone()
744            }
745        });
746        (keys, value.expect("The coord map should be mirrored (remove entry)"))
747    }
748
749    pub fn get(&self) -> &V {
750        self.entries
751            .y
752            .get()
753            .get(self.entries.x.key())
754            .expect("The coord map should be mirrored (get entry value)")
755    }
756
757    pub fn with_mut<F, T>(&mut self, modifier: F) -> T
758    where
759        V: Clone,
760        F: FnOnce(&mut V) -> T,
761    {
762        let entry_ref = self
763            .entries
764            .y
765            .get_mut()
766            .get_mut(self.entries.x.key())
767            .expect("The coord map should be mirrored (with_mut entry yx)");
768        let output = modifier(entry_ref);
769        let value = entry_ref.clone();
770        let entry_ref = self
771            .entries
772            .x
773            .get_mut()
774            .get_mut(self.entries.y.key())
775            .expect("The coord map should be mirrored (with_mut entry xy)");
776        *entry_ref = value;
777        output
778    }
779
780    pub fn into_ref(self) -> &'a V {
781        self.entries
782            .y
783            .into_mut()
784            .get(self.entries.x.key())
785            .expect("The coord map shpuçd be mirrored (into_ref)")
786    }
787
788    pub fn insert(&mut self, value: V) -> V
789    where
790        V: Clone,
791    {
792        let entry_ref =
793            self.entries.y.get_mut().get_mut(self.entries.x.key()).expect(
794                "The coord map should be mirrored (insert entry value yx)",
795            );
796        let old_value = mem::replace(entry_ref, value.clone());
797
798        let entry_ref =
799            self.entries.x.get_mut().get_mut(self.entries.y.key()).expect(
800                "The coord map should be mirrored (insert entry value xy)",
801            );
802        *entry_ref = value;
803
804        old_value
805    }
806
807    pub fn remove(self) -> V
808    where
809        K: Clone,
810    {
811        let (_, value) = self.remove_entry();
812        value
813    }
814}
815
816pub enum Entry<'a, K, V> {
817    Vacant(VacantEntry<'a, K, V>),
818    Occupied(OccupiedEntry<'a, K, V>),
819}
820
821impl<'a, K, V> Entry<'a, K, V>
822where
823    K: Ord,
824{
825    pub fn or_insert(self, default: V) -> &'a V
826    where
827        K: Clone,
828        V: Clone,
829    {
830        match self {
831            Self::Vacant(entry) => entry.insert(default),
832            Self::Occupied(entry) => entry.into_ref(),
833        }
834    }
835
836    pub fn or_insert_with<F>(self, default: F) -> &'a V
837    where
838        K: Clone,
839        V: Clone,
840        F: FnOnce() -> V,
841    {
842        match self {
843            Self::Vacant(entry) => entry.insert(default()),
844            Self::Occupied(entry) => entry.into_ref(),
845        }
846    }
847
848    pub fn or_insert_with_key<F>(self, default: F) -> &'a V
849    where
850        K: Clone,
851        V: Clone,
852        F: FnOnce(CoordPair<&K>) -> V,
853    {
854        match self {
855            Self::Vacant(entry) => {
856                let value = default(entry.key());
857                entry.insert(value)
858            },
859            Self::Occupied(entry) => entry.into_ref(),
860        }
861    }
862
863    pub fn key(&self) -> CoordPair<&K> {
864        match self {
865            Self::Vacant(entry) => entry.key(),
866            Self::Occupied(entry) => entry.key(),
867        }
868    }
869
870    pub fn and_modify<F>(mut self, modifier: F) -> Self
871    where
872        K: Clone,
873        V: Clone,
874        F: FnOnce(&mut V),
875    {
876        match &mut self {
877            Self::Occupied(entry) => {
878                entry.with_mut(modifier);
879            },
880            _ => (),
881        }
882        self
883    }
884
885    pub fn or_default(self) -> &'a V
886    where
887        K: Clone,
888        V: Clone + Default,
889    {
890        self.or_insert_with(Default::default)
891    }
892}
893
894#[derive(Debug, Clone)]
895pub struct Iter<'a, K, V> {
896    axis: Axis,
897    outer: btree_map::Iter<'a, K, BTreeMap<K, V>>,
898    inner_front: Option<(&'a K, btree_map::Iter<'a, K, V>)>,
899    inner_back: Option<(&'a K, btree_map::Iter<'a, K, V>)>,
900}
901
902impl<'a, K, V> Iterator for Iter<'a, K, V> {
903    type Item = (CoordPair<&'a K>, &'a V);
904
905    fn next(&mut self) -> Option<Self::Item> {
906        loop {
907            let (outer_key, mut inner_iter) =
908                self.inner_front.take().or_else(|| self.inner_back.take())?;
909            match inner_iter.next() {
910                Some((inner_key, value)) => {
911                    self.inner_front = Some((outer_key, inner_iter));
912                    let key = CoordPair::with_order(outer_key, inner_key)
913                        .shift_to(self.axis);
914                    break Some((key, value));
915                },
916                None => {
917                    self.inner_front =
918                        self.outer.next().map(|(key, tree)| (key, tree.iter()));
919                },
920            }
921        }
922    }
923
924    fn size_hint(&self) -> (usize, Option<usize>) {
925        let (outer_low, _) = self.outer.size_hint();
926        let front_low = self
927            .inner_front
928            .as_ref()
929            .map(|(_, iter)| iter.size_hint())
930            .map(|(low, _)| low)
931            .unwrap_or_default();
932        let back_low = self
933            .inner_back
934            .as_ref()
935            .map(|(_, iter)| iter.size_hint())
936            .map(|(low, _)| low)
937            .unwrap_or_default();
938        (outer_low + front_low + back_low, None)
939    }
940}
941
942impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
943    fn next_back(&mut self) -> Option<Self::Item> {
944        loop {
945            let (outer_key, mut inner_iter) =
946                self.inner_back.take().or_else(|| self.inner_front.take())?;
947            match inner_iter.next_back() {
948                Some((inner_key, value)) => {
949                    self.inner_back = Some((outer_key, inner_iter));
950                    let key = CoordPair::with_order(outer_key, inner_key)
951                        .shift_to(self.axis);
952                    break Some((key, value));
953                },
954                None => {
955                    self.inner_back = self
956                        .outer
957                        .next_back()
958                        .map(|(key, tree)| (key, tree.iter()));
959                },
960            }
961        }
962    }
963}
964
965#[derive(Debug, Clone)]
966pub struct Keys<'a, K, V> {
967    inner: Iter<'a, K, V>,
968}
969
970impl<'a, K, V> Iterator for Keys<'a, K, V> {
971    type Item = CoordPair<&'a K>;
972
973    fn next(&mut self) -> Option<Self::Item> {
974        self.inner.next().map(|(key, _)| key)
975    }
976
977    fn size_hint(&self) -> (usize, Option<usize>) {
978        self.inner.size_hint()
979    }
980}
981
982impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
983    fn next_back(&mut self) -> Option<Self::Item> {
984        self.inner.next_back().map(|(key, _)| key)
985    }
986}
987
988#[derive(Debug, Clone)]
989pub struct Values<'a, K, V> {
990    inner: Iter<'a, K, V>,
991}
992
993impl<'a, K, V> Iterator for Values<'a, K, V> {
994    type Item = &'a V;
995
996    fn next(&mut self) -> Option<Self::Item> {
997        self.inner.next().map(|(_, value)| value)
998    }
999
1000    fn size_hint(&self) -> (usize, Option<usize>) {
1001        self.inner.size_hint()
1002    }
1003}
1004
1005impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
1006    fn next_back(&mut self) -> Option<Self::Item> {
1007        self.inner.next_back().map(|(_, value)| value)
1008    }
1009}
1010
1011#[derive(Debug)]
1012pub struct IntoIter<K, V> {
1013    axis: Axis,
1014    outer: btree_map::IntoIter<K, BTreeMap<K, V>>,
1015    inner_front: Option<(K, btree_map::IntoIter<K, V>)>,
1016    inner_back: Option<(K, btree_map::IntoIter<K, V>)>,
1017}
1018
1019impl<K, V> Iterator for IntoIter<K, V>
1020where
1021    K: Clone,
1022{
1023    type Item = (CoordPair<K>, V);
1024
1025    fn next(&mut self) -> Option<Self::Item> {
1026        loop {
1027            let (outer_key, mut inner_iter) =
1028                self.inner_front.take().or_else(|| self.inner_back.take())?;
1029            match inner_iter.next() {
1030                Some((inner_key, value)) => {
1031                    self.inner_front = Some((outer_key.clone(), inner_iter));
1032                    let key = CoordPair::with_order(outer_key, inner_key)
1033                        .shift_to(self.axis);
1034                    break Some((key, value));
1035                },
1036                None => {
1037                    self.inner_front = self
1038                        .outer
1039                        .next()
1040                        .map(|(key, tree)| (key, tree.into_iter()));
1041                },
1042            }
1043        }
1044    }
1045
1046    fn size_hint(&self) -> (usize, Option<usize>) {
1047        let (outer_low, _) = self.outer.size_hint();
1048        let front_low = self
1049            .inner_front
1050            .as_ref()
1051            .map(|(_, iter)| iter.size_hint())
1052            .map(|(low, _)| low)
1053            .unwrap_or_default();
1054        let back_low = self
1055            .inner_back
1056            .as_ref()
1057            .map(|(_, iter)| iter.size_hint())
1058            .map(|(low, _)| low)
1059            .unwrap_or_default();
1060        (outer_low + front_low + back_low, None)
1061    }
1062}
1063
1064impl<K, V> DoubleEndedIterator for IntoIter<K, V>
1065where
1066    K: Clone,
1067{
1068    fn next_back(&mut self) -> Option<Self::Item> {
1069        loop {
1070            let (outer_key, mut inner_iter) =
1071                self.inner_back.take().or_else(|| self.inner_front.take())?;
1072            match inner_iter.next_back() {
1073                Some((inner_key, value)) => {
1074                    self.inner_back = Some((outer_key.clone(), inner_iter));
1075                    let key = CoordPair::with_order(outer_key, inner_key)
1076                        .shift_to(self.axis);
1077                    break Some((key, value));
1078                },
1079                None => {
1080                    self.inner_back = self
1081                        .outer
1082                        .next_back()
1083                        .map(|(key, tree)| (key, tree.into_iter()));
1084                },
1085            }
1086        }
1087    }
1088}
1089
1090#[derive(Debug)]
1091pub struct IntoKeys<K, V> {
1092    inner: IntoIter<K, V>,
1093}
1094
1095impl<K, V> Iterator for IntoKeys<K, V>
1096where
1097    K: Clone,
1098{
1099    type Item = CoordPair<K>;
1100
1101    fn next(&mut self) -> Option<Self::Item> {
1102        self.inner.next().map(|(key, _)| key)
1103    }
1104
1105    fn size_hint(&self) -> (usize, Option<usize>) {
1106        self.inner.size_hint()
1107    }
1108}
1109
1110impl<K, V> DoubleEndedIterator for IntoKeys<K, V>
1111where
1112    K: Clone,
1113{
1114    fn next_back(&mut self) -> Option<Self::Item> {
1115        self.inner.next_back().map(|(key, _)| key)
1116    }
1117}
1118
1119#[derive(Debug)]
1120pub struct IntoValues<K, V> {
1121    outer: btree_map::IntoValues<K, BTreeMap<K, V>>,
1122    inner_front: Option<btree_map::IntoValues<K, V>>,
1123    inner_back: Option<btree_map::IntoValues<K, V>>,
1124}
1125
1126impl<K, V> Iterator for IntoValues<K, V> {
1127    type Item = V;
1128
1129    fn next(&mut self) -> Option<Self::Item> {
1130        loop {
1131            let mut inner_iter =
1132                self.inner_front.take().or_else(|| self.inner_back.take())?;
1133            match inner_iter.next() {
1134                Some(value) => {
1135                    self.inner_front = Some(inner_iter);
1136                    break Some(value);
1137                },
1138                None => {
1139                    self.inner_front =
1140                        self.outer.next().map(BTreeMap::into_values)
1141                },
1142            }
1143        }
1144    }
1145
1146    fn size_hint(&self) -> (usize, Option<usize>) {
1147        let (outer_low, _) = self.outer.size_hint();
1148        let front_low = self
1149            .inner_front
1150            .as_ref()
1151            .map(|iter| iter.size_hint())
1152            .map(|(low, _)| low)
1153            .unwrap_or_default();
1154        let back_low = self
1155            .inner_back
1156            .as_ref()
1157            .map(|iter| iter.size_hint())
1158            .map(|(low, _)| low)
1159            .unwrap_or_default();
1160        (outer_low + front_low + back_low, None)
1161    }
1162}
1163
1164impl<K, V> DoubleEndedIterator for IntoValues<K, V> {
1165    fn next_back(&mut self) -> Option<Self::Item> {
1166        loop {
1167            let mut inner_iter =
1168                self.inner_back.take().or_else(|| self.inner_front.take())?;
1169            match inner_iter.next_back() {
1170                Some(value) => {
1171                    self.inner_back = Some(inner_iter);
1172                    break Some(value);
1173                },
1174                None => {
1175                    self.inner_back =
1176                        self.outer.next_back().map(BTreeMap::into_values)
1177                },
1178            }
1179        }
1180    }
1181}
1182
1183#[derive(Debug, Clone)]
1184pub struct Range<'q, 'a, Q, K, V> {
1185    higher_axis: Axis,
1186    inner_range_start: Bound<&'q Q>,
1187    inner_range_end: Bound<&'q Q>,
1188    outer: btree_map::Range<'a, K, BTreeMap<K, V>>,
1189    inner_front: Option<(&'a K, btree_map::Range<'a, K, V>)>,
1190    inner_back: Option<(&'a K, btree_map::Range<'a, K, V>)>,
1191}
1192
1193impl<'q, 'a, Q, K, V> Iterator for Range<'q, 'a, Q, K, V>
1194where
1195    K: Ord + Borrow<Q>,
1196    Q: Ord,
1197{
1198    type Item = (CoordPair<&'a K>, &'a V);
1199
1200    fn next(&mut self) -> Option<Self::Item> {
1201        loop {
1202            let (outer_key, mut inner_iter) =
1203                self.inner_front.take().or_else(|| self.inner_back.take())?;
1204            match inner_iter.next() {
1205                Some((inner_key, value)) => {
1206                    self.inner_front = Some((outer_key, inner_iter));
1207                    let key = CoordPair::with_order(outer_key, inner_key)
1208                        .shift_to(self.higher_axis);
1209                    break Some((key, value));
1210                },
1211                None => {
1212                    let inner_range =
1213                        (self.inner_range_start, self.inner_range_end);
1214                    self.inner_front = self
1215                        .outer
1216                        .next()
1217                        .map(|(key, tree)| (key, tree.range(inner_range)));
1218                },
1219            }
1220        }
1221    }
1222
1223    fn size_hint(&self) -> (usize, Option<usize>) {
1224        let (outer_low, _) = self.outer.size_hint();
1225        let front_low = self
1226            .inner_front
1227            .as_ref()
1228            .map(|(_, iter)| iter.size_hint())
1229            .map(|(low, _)| low)
1230            .unwrap_or_default();
1231        let back_low = self
1232            .inner_back
1233            .as_ref()
1234            .map(|(_, iter)| iter.size_hint())
1235            .map(|(low, _)| low)
1236            .unwrap_or_default();
1237        (outer_low + front_low + back_low, None)
1238    }
1239}
1240
1241impl<'q, 'a, Q, K, V> DoubleEndedIterator for Range<'q, 'a, Q, K, V>
1242where
1243    K: Ord + Borrow<Q>,
1244    Q: Ord,
1245{
1246    fn next_back(&mut self) -> Option<Self::Item> {
1247        loop {
1248            let (outer_key, mut inner_iter) =
1249                self.inner_back.take().or_else(|| self.inner_front.take())?;
1250            match inner_iter.next_back() {
1251                Some((inner_key, value)) => {
1252                    self.inner_back = Some((outer_key, inner_iter));
1253                    let key = CoordPair::with_order(outer_key, inner_key)
1254                        .shift_to(self.higher_axis);
1255                    break Some((key, value));
1256                },
1257                None => {
1258                    let inner_range =
1259                        (self.inner_range_start, self.inner_range_end);
1260                    self.inner_back = self
1261                        .outer
1262                        .next_back()
1263                        .map(|(key, tree)| (key, tree.range(inner_range)));
1264                },
1265            }
1266        }
1267    }
1268}