Perl6::Junction - Perl6 style Junction operators in Perl5.


Perl6-Junction documentation Contained in the Perl6-Junction distribution.

Index


Code Index:

NAME

Top

Perl6::Junction - Perl6 style Junction operators in Perl5.

SYNOPSIS

Top

  use Perl6::Junction qw/ all any none one /;

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

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

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

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

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

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

DESCRIPTION

Top

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

Inspired by the Perl6 design docs, http://dev.perl.org/perl6/doc/design/exe/E06.html.

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

Top

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

Top

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

EXPORT

Top

'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 Perl6::Junction;

  if (Perl6::Junction::any( @questions )) {
    ...
  }

WARNING

Top

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 overriden.

TO DO

Top

Add overloading for arithmetic operators, such that this works:

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

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

SUPPORT / BUGS

Top

Submit to the CPAN bugtracker http://rt.cpan.org

SEE ALSO

Top

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% improvment.

http://dev.perl.org/perl6/doc/design/exe/E06.html - "The Wonderful World of Junctions".

AUTHOR

Top

Carl Franks

ACKNOWLEDGEMENTS

Top

Thanks to Curtis "Ovid" Poe for the "ALTERING JUNCTIONS" changes in release 0.40000.

COPYRIGHT AND LICENSE

Top


Perl6-Junction documentation Contained in the Perl6-Junction distribution.

package Perl6::Junction;
use strict;

use Perl6::Junction::All;
use Perl6::Junction::Any;
use Perl6::Junction::None;
use Perl6::Junction::One;

require Exporter;
our $VERSION = '1.40000';

our @ISA = qw/ Exporter /;
my @routines = qw/ all any none one /;
our @EXPORT_OK = @routines;
our %EXPORT_TAGS = ( ALL => [@routines] );

sub all {
    return Perl6::Junction::All->new(@_);
}

sub any {
    return Perl6::Junction::Any->new(@_);
}

sub none {
    return Perl6::Junction::None->new(@_);
}

sub one {
    return Perl6::Junction::One->new(@_);
}

1;

__END__