Re: [RFC] Global functions any() and all() on iterables
| From: | tyson andre | Date: | Sat, 06 Feb 2021 15:00:43 +0000 |
| Subject: | Re: [RFC] Global functions any() and all() on iterables | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-113102@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
> $satisifies_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().
The implementation and RFC https://wiki.php.net/rfc/any_all_on_iterable
have been updated
after finishing the previous straw poll: https://wiki.php.net/rfc/any_all_on_iterable_straw_poll_namespace
This is now a vote on
PHP\iterable\any(iterable $input, ?callable $callback = null) and
PHP\iterable\all(...).
A secondary vote was added for choosing between any/all and
any_value/all_values within PHP\iterable.
I plan to start the vote on Monday.
Any other feedback?
Thanks,
- Tyson