Makes perfect sense. I'm trying to implement reject() by wrapping the predicate in a function which negates its output. Sounds easy, but I can't figure out how to create a function or closure which implements FnMut. I'm getting "expected type parameter P ... found closure ...".
Here's my first naive attempt, which returns that error:
The problem here is that wrapping a function in closure changes its type. You're saying that you will create a Filter<Self, P>, but you're really creating a differentFilter<Self, F>, where F is the (unnameable) type of created closure.
Unhappily, there's little we can do here, due to this unnameability. You can't explicitly name the output type of reject, since you don't know it. You can't use impl Trait syntax either, since this is not a free function. And even if you could, Filter::new is private, so you can't call it in your code.
The only nameable function type you can create on stable by wrapping a generic Fn* is Box<dyn Fn*>, no matter what you do. On nightly, you can try and implement FnOnce and FnMut manually.
A more stable approach would be to implement your own copy of the Filter struct which does the same thing applies the function in the opposite polarity.
It's definitely not as nice as just reusing Filter, but I believe it's the best you can do on stable.