Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Iterator trait bounds to IntoEnumIterator (#314)
The concrete Iterator type for all implementations of IntoEnumIterator is guaranteed to implement these traits, because the only implementor is the `#[derive(EnumIter)]` macro, which emits an impl for each for the generated {EnumType}Iter struct. However, when using IntoEnumIterator as a generic constraint, the concrete type is not known, so the impl of these traits cannot be inferred by the type checker with out additional help. Here are some examples, using Itertools::cartesian_product() as the motivator, because it requires `Iterator + Clone`: // We know this function will work, but it fails to type check // without these additional trait bounds on IntoEnumIterator. pub fn example_broken<T: Clone + IntoEnumIterator, U: Clone + IntoEnumIterator>( ) -> impl Iterator<Item = (T, U)> + Clone { T::iter().cartesian_product(U::iter()) } // It's possible to add where constraints at the use point to // workaround the issue, without this change. // This version will typecheck. pub fn example_workaround<T: Clone + IntoEnumIterator, U: Clone + IntoEnumIterator>( ) -> impl Iterator<Item = (T, U)> where <T as IntoEnumIterator>::Iterator: Clone, <U as IntoEnumIterator>::Iterator: Clone, { T::iter().cartesian_product(U::iter()) }
- Loading branch information