I don't agree that the convention is to use a trait for this. Sure, people do that sometimes, but using two different functions with different names is also very common. I would not bother with traits for this case â that is over-complicating it.
(In fact, I don't think it's possible due to conflicting implementations in this case. But I probably still wouldn't in this case even if it was possible.)
Directly implementing traits for iterator is probably not possible here.
But your first function looks very similar to the standard library function collect, just with some processing added to turn a Foo into a Goo. The second function takes a slice as an input, which can also be converted into an iterator. To unify the two functions it remains to produce the output. Maybe you can specify that as a type parameter like for collect (and use collect?).
That is interesting; maybe the compiler could conclude that since there's an impl<I: Iterator> IntoIterator for I there can't be a type that impls both so the above is valid?
I guess that will over-complicate the coherence rules, though...
There is a type that impls both, precisely because of this blanket impl. There can't be a type that explicitly equals both, but for the sake of "impl existence" blanket and explicit implementations are probably indistinguishable.