1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
NAME
Syntax::Keyword::Junction - Comparisons against multiple values
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') {
...
}
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/".
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 one and only one argument tests true according to
the operator used.
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
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 )) {
...
}
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.
TO DO
Add overloading for arithmetic operators, such that this works:
$result = any(2,3,4) * 2;
if ($result == 8) {...}
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".
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>
AUTHORS
* Arthur Axel "fREW" Schmidt <frioux+cpan@gmail.com>
* Carl Franks
COPYRIGHT AND LICENSE
This software is copyright (c) 2024 by Arthur Axel "fREW" Schmidt.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
|