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
use super::LevelManifest;
use crate::Segment;
use std::sync::Arc;

pub struct LevelManifestIterator<'a> {
    level_manifest: &'a LevelManifest,
    current_level: usize,
    current_idx: usize,
}

impl<'a> LevelManifestIterator<'a> {
    #[must_use]
    pub fn new(level_manifest: &'a LevelManifest) -> Self {
        Self {
            level_manifest,
            current_idx: 0,
            current_level: 0,
        }
    }
}

impl<'a> Iterator for LevelManifestIterator<'a> {
    type Item = Arc<Segment>;

    fn next(&mut self) -> Option<Self::Item> {
        loop {
            let segment = self
                .level_manifest
                .levels
                .get(self.current_level)?
                .segments
                .get(self.current_idx)
                .cloned();

            if let Some(segment) = segment {
                self.current_idx += 1;
                return Some(segment);
            }

            self.current_level += 1;
            self.current_idx = 0;
        }
    }
}