1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use crate::{iters::KeyValueReader, serde::ReadResult, types::Deser};
use anyhow::Result;
use derive_more::From;
use std::io::{Read, Seek};

#[derive(From)]
pub struct KeyValueIterator<RS, K, V> {
    r: KeyValueReader<RS, K, V>,
}
impl<RS, K, V> Iterator for KeyValueIterator<RS, K, V>
where
    RS: Read + Seek,
    K: Deser,
    V: Deser,
{
    type Item = Result<(K, V)>;
    fn next(&mut self) -> Option<Self::Item> {
        let res_opt_kv = self.r.deser_kv().map(|read_result| match read_result {
            ReadResult::EOF => None,
            ReadResult::Some(_r_len, kv) => Some(kv),
        });
        res_opt_kv.transpose()
    }
}

#[derive(From)]
pub struct KeyIterator<RS, K, V> {
    r: KeyValueReader<RS, K, V>,
}
impl<RS, K, V> Iterator for KeyIterator<RS, K, V>
where
    RS: Read + Seek,
    K: Deser,
    V: Deser,
{
    type Item = Result<K>;
    fn next(&mut self) -> Option<Self::Item> {
        let res_opt_kv = self
            .r
            .deser_k_skip_v()
            .map(|read_result| match read_result {
                ReadResult::EOF => None,
                ReadResult::Some(_r_len, k) => Some(k),
            });
        res_opt_kv.transpose()
    }
}