use std::{collections::VecDeque, sync::Arc}; use pandascore::{ endpoint::{CollectionOptions, ListResponse}, ClientTransport, }; use crate::adapter::AdapterInner; #[derive(Debug)] pub struct PaginationIterator { adapter: Arc>, results: VecDeque, next: Option, f: F, } impl PaginationIterator where C: ClientTransport, F: Fn(Arc>, CollectionOptions) -> Option>, { pub fn new(adapter: Arc>, next: CollectionOptions, f: F) -> Self { Self { adapter, results: VecDeque::new(), next: Some(next), f, } } } impl Iterator for PaginationIterator where C: ClientTransport, F: Fn(Arc>, CollectionOptions) -> Option>, { type Item = T; fn next(&mut self) -> Option { if let Some(next) = self.results.pop_front() { return Some(next); } if let Some(next) = self.next.take() { let mut response = (self.f)(Arc::clone(&self.adapter), next)?; self.next = response.next.take(); self.results = response.results.into(); self.results.pop_front() } else { None } } }