From 64948ce4194b62a8d7c48e77cdbe71eae8de66f0 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 6 Dec 2022 20:23:40 +0100
Subject: [PATCH] RUST: Add a way to get the content of a range in the database
 queue

---
 src/rust/liblektor-rs/src/database/queue.rs | 26 ++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/rust/liblektor-rs/src/database/queue.rs b/src/rust/liblektor-rs/src/database/queue.rs
index ebaf41ae..10e40541 100644
--- a/src/rust/liblektor-rs/src/database/queue.rs
+++ b/src/rust/liblektor-rs/src/database/queue.rs
@@ -1,4 +1,8 @@
-use std::collections::VecDeque;
+use std::{
+    collections::VecDeque,
+    ops::{Index, Range},
+    slice::SliceIndex,
+};
 
 /// The number of priority levels in the queues. The higher the number, the
 /// higher the priority.
@@ -52,6 +56,12 @@ pub struct LktDatabaseQueueIter<'a> {
     index: usize,
 }
 
+/// The iterator for a range of karas from the database queue.
+pub struct LktDatabaseQueueRangeIter<'a> {
+    iterator: LktDatabaseQueueIter<'a>,
+    remaining: usize,
+}
+
 impl<'a> Iterator for LktDatabaseQueueIter<'a> {
     type Item = u64;
 
@@ -123,4 +133,18 @@ impl LktDatabaseQueue {
             .find(|content| !content.is_empty())?;
         level.pop_front()
     }
+
+    pub fn range(&self, range: Range<usize>) -> LktDatabaseQueueRangeIter {
+        let mut iter = self.iter();
+        let remaining = range.end.checked_sub(range.start).unwrap_or(0);
+        if remaining >= 1 {
+            for _ in 0..range.start {
+                iter.next();
+            }
+        }
+        LktDatabaseQueueRangeIter {
+            iterator: iter,
+            remaining,
+        }
+    }
 }
-- 
GitLab