I'm trying to make an enum store any kind of iterator defined as:
pub enum TraverserResult<'a> {
NodesIter(Box<dyn Iterator<Item = (&'a NodeId, &'a NodeRef)> + 'a>),
Empty
}
The idea is that I don't want to enumerate all possible Iterators forms (Iter, Cloned, Filter...).
And I want to use it like that:
fn execute_filter_with_label(&self, previous: &TraverserResult, label: &String) -> TraverserResult {
match previous {
TraverserResult::NodesIter(iter) => {
let res = iter.filter(|(_, node)| node.has_label(label));
TraverserResult::NodesIter(Box::new(res))
},
TraverserResult::Empty => {
TraverserResult::Empty
}
}
}
But when I compile I get the following error:
--> src/graph_engine/traversal/traversal.rs:118:17
|
114 | fn execute_filter_with_label(&self, previous: &TraverserResult, label: &String) -> TraverserResult {
| --------------- ---------------
| |
| this parameter and the return type are declared with different lifetimes...
...
118 | TraverserResult::NodesIter(Box::new(res))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...but data fromprevious
is returned here
And I understand why but how do I copy an iterator so I can reuse it? The code is called from:
pub fn execute(&self) -> TraverserResult {
let mut res = TraverserResult::Empty;
for step in &self.steps {
res = match step {
TraverserStep::GetNodes => {
self.execute_nodes()
}
TraverserStep::FilterWithLabel(label) => {
self.execute_filter_with_label(&res, &label)
}
};
}
res
}
Thanks for help.