Skip to main content

neo_types/
iterator.rs

1// Copyright (c) 2025-2026 R3E Network
2// Licensed under the MIT License
3
4use std::vec::Vec;
5
6/// Neo N3 Iterator type
7///
8/// This iterator efficiently traverses elements using an internal cursor,
9/// avoiding O(n) overhead of Vec::remove(0) that would occur with a naive
10/// implementation. Implements `std::iter::Iterator` for use with `for` loops
11/// and iterator combinators.
12#[derive(Debug, Clone)]
13pub struct NeoIterator<T> {
14    data: Vec<T>,
15    cursor: usize,
16}
17
18impl<T> NeoIterator<T> {
19    /// Creates a new iterator from a vector.
20    pub fn new(data: Vec<T>) -> Self {
21        Self { data, cursor: 0 }
22    }
23
24    /// Returns true if there are more elements to iterate.
25    pub fn has_next(&self) -> bool {
26        self.cursor < self.data.len()
27    }
28
29    /// Returns the number of remaining elements.
30    pub fn len(&self) -> usize {
31        self.data.len().saturating_sub(self.cursor)
32    }
33
34    /// Returns true if no more elements are available.
35    pub fn is_empty(&self) -> bool {
36        self.len() == 0
37    }
38
39    /// Resets the iterator to the beginning.
40    pub fn reset(&mut self) {
41        self.cursor = 0;
42    }
43
44    /// Returns the total number of elements (including already consumed).
45    pub fn total_len(&self) -> usize {
46        self.data.len()
47    }
48}
49
50impl<T: Clone> Iterator for NeoIterator<T> {
51    type Item = T;
52
53    fn next(&mut self) -> Option<T> {
54        if self.cursor >= self.data.len() {
55            None
56        } else {
57            let item = self.data[self.cursor].clone();
58            self.cursor += 1;
59            Some(item)
60        }
61    }
62
63    fn size_hint(&self) -> (usize, Option<usize>) {
64        let remaining = self.len();
65        (remaining, Some(remaining))
66    }
67}
68
69impl<T: Clone> ExactSizeIterator for NeoIterator<T> {}