logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Syntax::Keyword::Junction - Comparisons against multiple values

Altering Junctions

       You cannot alter junctions.  Instead, you can create new junctions out of old junctions.  You can do this
       by calling the "values" method on a junction.

         my $numbers = any(qw/1 2 3 4 5/);
         print $numbers == 3 ? 'Yes' : 'No';   # Yes

         $numbers = any( grep { $_ != 3 } $numbers->values );
         print $numbers == 3 ? 'Yes' : 'No';   # No

       You can also use the "map" method:

         my $numbers = any(qw/1 2 3 4 5/);
         my $prime   = $numbers->map( \&is_prime );

         say for $prime->values; # prints 0, 1, 1, 0, 1

Authors

       •   Arthur Axel "fREW" Schmidt <frioux+cpan@gmail.com>

       •   Carl Franks

Bugs

       Please report any bugs or feature requests on the bugtracker website
       <https://github.com/haarg/Syntax-Keyword-Junction/issues>

       When submitting a bug or request, please include a test-file or a patch to an existing test-file that
       illustrates the bug or desired feature.

Contributors

       •   Arthur Axel 'fREW' Schmidt <frioux@gmail.com>

       •   Carl Franks <cpan@fireartist.com>

       •   David Steinbrunner <dsteinbrunner@pobox.com>

       •   Graham Knop <haarg@haarg.org>

       •   Maxime Soulé <btik-cpan@scoubidou.com>

       •   Michael Schout <schoutm@gmail.com>

       •   Olivier Mengué <dolmen@cpan.org>

       •   Paul Cochrane <paul.cochrane@posteo.de>

       •   Ricardo Signes <rjbs@cpan.org>

       •   Rob Hoelz <rob@hoelz.ro>

Description

       This is a lightweight module which provides 'Junction' operators, the most commonly used being "any" and
       "all".

       Inspired by the Perl 6 design docs,
       <https://web.archive.org/web/20230922160729/https://raku.org/archive/doc/design/exe/E06.html#The%20Wonderful%20World%20of%20Junctions>.

       Provides a limited subset of the functionality of Quantum::Superpositions, see "SEE ALSO" for comment.

       Notice in the "SYNOPSIS" above, that if you want to match against a regular expression, you must use "=="
       or "!=". Not "=~" or "!~". You must also use a regex object, such as "qr/\d/", not a plain regex such as
       "/\d/".

Export

       'all', 'any', 'none', 'one', as requested.

       All subroutines can be called by its fully qualified name, if you don't want to export them.

         use Syntax::Keyword::Junction;

         if (Syntax::Keyword::Junction::any( @questions )) {
           ...
         }

Name

       Syntax::Keyword::Junction - Comparisons against multiple values

See Also

       This module is actually a fork of Perl6::Junction with very few (initial) changes.  The reason being that
       we want to avoid the incendiary name containing Perl 6.

       Quantum::Superpositions provides the same functionality as this, and more. However, this module provides
       this limited functionality at a much greater runtime speed, with my benchmarks showing between 500% and
       6000% improvement.

       <https://web.archive.org/web/20230922160729/https://raku.org/archive/doc/design/exe/E06.html#The%20Wonderful%20World%20of%20Junctions>
       - "The Wonderful World of Junctions".

Subroutines

all()
       Returns an object which overloads the following operators:

         '<',  '<=', '>',  '>=', '==', '!=',
         'lt', 'le', 'gt', 'ge', 'eq', 'ne',
         '~~'

       Returns true only if all arguments test true according to the operator used.

   any()
       Returns an object which overloads the following operators:

         '<',  '<=', '>',  '>=', '==', '!=',
         'lt', 'le', 'gt', 'ge', 'eq', 'ne',
         '~~'

       Returns true if any argument tests true according to the operator used.

   none()
       Returns an object which overloads the following operators:

         '<',  '<=', '>',  '>=', '==', '!=',
         'lt', 'le', 'gt', 'ge', 'eq', 'ne',
         '~~'

       Returns true only if no argument tests true according to the operator used.

   one()
       Returns an object which overloads the following operators:

         '<',  '<=', '>',  '>=', '==', '!=',
         'lt', 'le', 'gt', 'ge', 'eq', 'ne',
         '~~'

       Returns true only if oneandonlyone argument tests true according to the operator used.

Synopsis

         use Syntax::Keyword::Junction qw/ all any none one /;

         if (any(@grant) eq 'su') {
           ...
         }

         if (all($foo, $bar) >= 10) {
           ...
         }

         if (qr/^\d+$/ == all(@answers)) {
           ...
         }

         if (all(@input) <= scalar @limits) {
           ...
         }

         if (none(@pass) eq 'password') {
           ...
         }

         if (one(@answer) == 42) {
           ...
         }

       or if you want to rename an export, use Sub::Exporter options:

         use Syntax::Keyword::Junction any => { -as => 'robot_any' };

         if (robot_any(@grant) eq 'su') {
           ...
         }

To Do

       Add overloading for arithmetic operators, such that this works:

         $result = any(2,3,4) * 2;

         if ($result == 8) {...}

Warning

       When comparing against a regular expression, you must remember to use a regular expression object:
       "qr/\d/" Not "/d/". You must also use either "==" or "!=". This is because "=~" and "!~" cannot be
       overridden.

See Also