Logical vectors can be supplied instead of predicate functions

This patch allows `keep()`, `discard()` and `map_if()` to receive a logical vector instead of a predicate function.

Useful when a logical vector is available and the corresponding predicate function is a complicated lambda.