On Sun, Apr 7, 2024 at 8:38 AM Larry Garfield <la...@garfieldtech.com> wrote:
>
> On Sun, Apr 7, 2024, at 10:20 AM, Joshua Rüsweg wrote:
> > Hi
> > I have created an RFC to add the function array_find which returns the
> > first element for which a predicate callback returns true. This is a
> > function which I missed often. Furthermore this type of function is
> > implemented with other programming languages like C++, JavaScript and
> > Rust, too.
> > You can find the RFC at:
> > https://wiki.php.net/rfc/array_find
> > Proof of concept implementation is in:
> > https://github.com/joshuaruesweg/php-src/commit/9f3fc252b92f534d498e5f1e6a463e15f45da208
> > I'm looking forward to your feedback.
> > Cheers
> > Joshua Rüsweg
>
> I'm open to this, but two points that I'm sure someone will bring up:
>
> 1. Should this work on arrays or iterables?  This is a long standing 
> limitation of PHP.  The array operations don't work on iterables, even though 
> we've had iterables for 20 years.)
>
> 2. Key handling.  It's good that you have looked into this, because I was 
> going to mention it. :-)  However, I don't think a boolean is the right 
> answer, since the question is binary, not true/false.  (Those are not the 
> same thing.)  I think a small return-mode Enum would make more sense here.

IMO, it's better to separate it into two functions because its type is
stable without control flow. For instance:

    // Returns K if $b is true, V otherwise.
    function array_find(
        array<K, V> $array,
        callable(V, K): bool $callback,
        bool $b = false
    ) -> K|V;

This isn't stable and requires control-flow to understand the type.
These are simpler:

    function array_find(
        array<K, V> $array,
        callable(V, K): bool $callback
    ) -> V;

    function array_find_key(
        array<K, V> $array,
        callable(V, K): bool $callback
    ) -> K;

Naming bikeshedding aside, it's better to have types that are
inferrable without function-specific knowledge of control flow. It
doesn't matter if it's a bool or an enum, it still has problems.
Better to just separate them to different functions.

Reply via email to