[RFC] Global functions any() and all() on iterables
| From: | tyson andre | Date: | Mon, 31 Aug 2020 23:56:21 +0000 |
| Subject: | [RFC] Global functions any() and all() on iterables | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-111756@lists.php.net to get a copy of this message | ||
Hi internals,
I've created an RFC for https://wiki.php.net/rfc/any_all_on_iterable
This was proposed 2 days ago in https://externals.io/message/111711 with some
interest
("Proposal: Adding functions any(iterable $input, ?callable $cb = null, int $use_flags=0) and
all(...)")
- The $use_flags parameter was removed
The primitives any() and all() are a common part of many programming languages and help in avoiding
verbosity or unnecessary abstractions.
- https://hackage.haskell.org/package/base-4.14.0.0/docs/Prelude.html#v:any
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some
- https://docs.python.org/3/library/functions.html#all
- https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#allMatch-java.util.function.Predicate-
For example, the following code could be shortened significantly
```
// Old version
$satisifes_predicate = false;
foreach ($item_list as $item) {
if (API::satisfiesCondition($item)) {
$satisfies_predicate = true;
break;
}
}
if (!$satisfies_predicate) {
throw new APIException("No matches found");
}
// New version is much shorter and readable
if (!any($item_list, fn($item) => API::satisfiesCondition($item))) {
throw new APIException("No matches found");
}
```
That example doesn't have any suitable helpers already in the standard library.
Using array_filter would unnecessarily call satisfiesCondition even after the first item was found,
and array_search doesn't take a callback.
A proposed implementation is https://github.com/php/php-src/pull/6053 -
it takes similar flags and param orders to array_filter().
Thanks,
- Tyson