dyn-iter
![continuous-integration-badge] ![code-coverage-badge] ![crates.io-badge] ![license-badge] ![documentation-badge]
This tiny crate should help you simplify your code when you need to wrap
[Iterator
] as trait-object.
Imagine for example a trait like the following.
```rust
enum Color {
Red,
Green,
Blue,
White,
Black,
}
trait Colors<'a> {
type ColorsIter: Iterator
As an implementor, you have a struct Flag
that looks like this.
```rust
struct Flag {
pub primarycolors: HashSet
you might implement Colors
that look like this
```rust,ignore
impl<'a> Colors<'a> for Flag { type ColorsIter = ???; fn colors(&'a self) -> Self::ColorsIter { self.primarycolors .iter() .chain(&self.secondarycolors) .filter(|color| **color != Color::Black) .copied() } } ```
With the above implementation, defining the associated type ColorsIter
might
be difficult. DynIter
should simplify your life because you can just write the
following implementation.
```rust
impl<'a> Colors<'a> for Flag { type ColorsIter = DynIter<'a, Color>; fn colors(&'a self) -> Self::ColorsIter { self.primarycolors .iter() .chain(&self.secondarycolors) .filter(|color| **color != Color::Black) .copied() .intodyniter() } } ```
Behind the scene, DynIter<'iter, V>
is only providing a wrapper around a
Box<dyn Iterator<Item = V> + 'iter>
.
For more details about why this crate exists, read this [blog post].