1use std::fmt;
2use std::marker::PhantomData;
3
4use redb::StorageError;
5
6use crate::{AccessGuard, SortKey, SortOrder};
7
8pub struct Range<'a, K, V, IK = &'static [u8]>
9where
10 IK: redb::Value + 'static + redb::Key,
11{
12 inner: redb::Range<'a, IK, &'static [u8]>,
13 _k: PhantomData<K>,
14 _v: PhantomData<V>,
15}
16
17impl<'a, S, K, V> From<redb::Range<'a, SortKey<S>, &'static [u8]>> for Range<'a, K, V, SortKey<S>>
18where
19 S: SortOrder + fmt::Debug,
20{
21 fn from(inner: redb::Range<'a, SortKey<S>, &'static [u8]>) -> Self {
22 Self {
23 inner,
24 _k: PhantomData,
25 _v: PhantomData,
26 }
27 }
28}
29
30impl<'a, K, V> Iterator for Range<'a, K, V, &'static [u8]> {
31 type Item = Result<(AccessGuard<'a, K>, AccessGuard<'a, V>), StorageError>;
32
33 fn next(&mut self) -> Option<Self::Item> {
34 Some(
35 self.inner
36 .next()?
37 .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
38 )
39 }
40}
41
42impl<'a, S, K, V> Iterator for Range<'a, K, V, SortKey<S>>
43where
44 S: SortOrder + fmt::Debug,
45{
46 type Item = Result<(AccessGuard<'a, K, SortKey<S>>, AccessGuard<'a, V>), StorageError>;
47
48 fn next(&mut self) -> Option<Self::Item> {
49 Some(
50 self.inner
51 .next()?
52 .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
53 )
54 }
55}
56impl<K, V> DoubleEndedIterator for Range<'_, K, V, &'static [u8]> {
57 fn next_back(&mut self) -> Option<Self::Item> {
58 Some(
59 self.inner
60 .next_back()?
61 .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
62 )
63 }
64}
65
66impl<S, K, V> DoubleEndedIterator for Range<'_, K, V, SortKey<S>>
67where
68 S: SortOrder + fmt::Debug,
69{
70 fn next_back(&mut self) -> Option<Self::Item> {
71 Some(
72 self.inner
73 .next_back()?
74 .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
75 )
76 }
77}