rfc:any_all_on_iterable
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:any_all_on_iterable [2021/02/06 14:19] – tandre | rfc:any_all_on_iterable [2021/06/13 14:36] (current) – tandre | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: PHP\iterable\any() and all() on iterables ====== | ====== PHP RFC: PHP\iterable\any() and all() on iterables ====== | ||
- | * Version: 0.4 | + | * Version: 0.6 |
* Date: 2020-08-30 | * Date: 2020-08-30 | ||
* Author: Tyson Andre, tandre@php.net | * Author: Tyson Andre, tandre@php.net | ||
- | * Status: | + | * Status: |
* First Published at: https:// | * First Published at: https:// | ||
* Implementation: | * Implementation: | ||
Line 23: | Line 23: | ||
<code php> | <code php> | ||
// The old version | // The old version | ||
- | $satisifes_predicate | + | $satisifies_predicate |
foreach ($item_list as $item) { | foreach ($item_list as $item) { | ||
// Performs DB operations or external service requests, stops on first match by design. | // Performs DB operations or external service requests, stops on first match by design. | ||
Line 49: | Line 49: | ||
===== Proposal ===== | ===== Proposal ===== | ||
- | Add the functions '' | + | Add the functions '' |
(The namespace '' | (The namespace '' | ||
+ | |||
+ | **The implementation is equivalent to the following polyfill:** | ||
<code php> | <code php> | ||
namespace PHP\iterable; | namespace PHP\iterable; | ||
- | /** Determines whether any element of the iterable satisfies the predicate. */ | + | /** |
- | function any(iterable $input, ?callable $callback = null) { | + | * Determines whether any element of the iterable satisfies the predicate. |
+ | * | ||
+ | * | ||
+ | * If the value returned by the callback is truthy | ||
+ | * (e.g. true, non-zero number, non-empty array, truthy object, etc.), | ||
+ | * this is treated as satisfying the predicate. | ||
+ | * | ||
+ | * @param iterable $input | ||
+ | * @param null|callable(mixed): | ||
+ | */ | ||
+ | function any(iterable $input, ?callable $callback = null): bool { | ||
foreach ($input as $v) { | foreach ($input as $v) { | ||
if ($callback !== null ? $callback($v) : $v) { | if ($callback !== null ? $callback($v) : $v) { | ||
Line 64: | Line 76: | ||
return false; | return false; | ||
} | } | ||
- | /** Determines whether all elements of the iterable satisfy the predicate */ | + | </ |
- | function all(iterable $input, ?callable $callback = null) { | + | <code php> |
+ | /** | ||
+ | * Determines whether all elements of the iterable satisfy the predicate. | ||
+ | * | ||
+ | * If the value returned by the callback is truthy | ||
+ | * (e.g. true, non-zero number, non-empty array, truthy object, etc.), | ||
+ | * this is treated as satisfying the predicate. | ||
+ | * | ||
+ | * @param iterable $input | ||
+ | * @param null|callable(mixed): | ||
+ | */ | ||
+ | function all(iterable $input, ?callable $callback = null): bool { | ||
foreach ($input as $v) { | foreach ($input as $v) { | ||
if (!($callback !== null ? $callback($v) : $v)) { | if (!($callback !== null ? $callback($v) : $v)) { | ||
Line 80: | Line 103: | ||
- If this was provided only in userland, there' | - If this was provided only in userland, there' | ||
- If the standard library provided it, then polyfills for newer php functionality could adopt this as well, making cleaner code easier to write. | - If the standard library provided it, then polyfills for newer php functionality could adopt this as well, making cleaner code easier to write. | ||
+ | |||
+ | ==== Implementation Details ==== | ||
+ | |||
+ | When '' | ||
+ | |||
+ | When '' | ||
+ | |||
+ | |||
+ | <code php> | ||
+ | php > var_export(PHP\iterable\any([false])); | ||
+ | false | ||
+ | php > var_export(PHP\iterable\any([true])); | ||
+ | true | ||
+ | php > var_export(PHP\iterable\any([0])); | ||
+ | false | ||
+ | php > var_export(PHP\iterable\any([1])); | ||
+ | true | ||
+ | php > var_export(PHP\iterable\any([0], | ||
+ | false | ||
+ | php > var_export(PHP\iterable\any([1], | ||
+ | true | ||
+ | |||
+ | php > var_export(PHP\iterable\all([true, | ||
+ | true | ||
+ | php > var_export(PHP\iterable\all([1, | ||
+ | true | ||
+ | php > var_export(PHP\iterable\all([true, | ||
+ | false | ||
+ | php > var_export(PHP\iterable\all([1, | ||
+ | false | ||
+ | php > var_export(PHP\iterable\all([1, | ||
+ | false | ||
+ | </ | ||
+ | |||
+ | ==== Secondary Vote: any()/all() or any_value()/ | ||
+ | |||
+ | A secondary vote will be held on whether to name this '' | ||
+ | |||
+ | PHP is unique in that the primitive array-like type '' | ||
+ | Existing function names vary in whether the fact that they only act on values is explicitly included in the name. | ||
+ | |||
+ | Many other programming languages have gone with a short name for the default of checking if a value is in a collection. | ||
+ | |||
+ | < | ||
+ | The primitives '' | ||
+ | |||
+ | - Haskell: https:// | ||
+ | - JavaScript: https:// | ||
+ | - Python: https:// | ||
+ | - Ruby: https:// | ||
+ | - Java 8(Stream): https:// | ||
+ | - C++: https:// | ||
+ | </ | ||
+ | |||
+ | Benefits of a shorter name: | ||
+ | |||
+ | - Conciseness for the most common use case of checking whether a predicate is true for any/all values of an iterable array/ | ||
+ | - Consistency with some other functions such as '' | ||
+ | - Potential to use $flags to extend this to support less common use cases like '' | ||
+ | |||
+ | Benefits of a longer name: | ||
+ | |||
+ | - A longer name would be more descriptive and make it easier to understand what code is doing. | ||
+ | - This makes it likely that in the future for iterable functionality, | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 202: | Line 289: | ||
- | ===== Proposed Voting Choices | + | ===== Vote ===== |
- | Add '' | + | Add '' |
- | A secondary vote requiring a simple majority | + | Voting started on 2021-02-08 and ended on 2021-02-22. |
+ | |||
+ | <doodle title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
+ | |||
+ | \\ The following | ||
+ | |||
+ | <doodle title=" | ||
+ | * any()/ | ||
+ | * any_value()/ | ||
+ | </ | ||
+ | |||
+ | ==== Straw Poll ==== | ||
+ | |||
+ | <doodle title=" | ||
+ | * Too small in scope | ||
+ | * Object to the choice of namespace | ||
+ | * Prefer the global namespace | ||
+ | * Confused about the implementation | ||
+ | * Prefer userland solutions | ||
+ | * Other | ||
+ | * Voted for this RFC | ||
+ | </ | ||
===== References ===== | ===== References ===== | ||
Line 214: | Line 325: | ||
- https:// | - https:// | ||
- [[rfc: | - [[rfc: | ||
- | - [[rfc: | + | - [[rfc: |
+ | - [[rfc: | ||
+ | - [[rfc: | ||
===== Rejected Features ===== | ===== Rejected Features ===== | ||
Line 222: | Line 334: | ||
===== Changelog ====== | ===== Changelog ====== | ||
- | 0.3: Add more quotes | + | * 0.3: Add more quotes |
- | 0.4: Change name to '' | + | |
+ | * 0.5: Add straw poll | ||
+ | * 0.6: Add examples of how this works, add in missing return type, clarify treatment of predicate $callback return type |
rfc/any_all_on_iterable.1612621160.txt.gz · Last modified: 2021/02/06 14:19 by tandre