NAME
   Operator::Util - A selection of array and hash functions that extend
   operators

VERSION
   This document describes Operator::Util version 0.01.

SYNOPSIS
       use Operator::Util qw(
           reduce reducewith
           zip zipwith
           cross crosswith
           hyper hyperwith
           applyop reverseop
       );

WARNING
   This is an early release of Operator::Util. The interface and
   functionality may change in the future based on user feedback. Please
   make suggestions by creating an issue at
   <http://github.com/patch/operator-util-pm5/issues>.

   The documentation is in the process of being thoroughly expanded.

DESCRIPTION
   A pragmatic approach at providing the functionality of many of Perl 6's
   meta operators in Perl 5.

   The terms "operator string" or "opstring" are used to describe a string
   that represents an operator, such as the string '+' for the addition
   operator or the string '.' for the concatenation operator. Except where
   noted, opstrings default to binary infix operators and the short form
   may be used, e.g., '*' instead of 'infix:*'. All other operator types
   (prefix, postfix, circumfix, and postcircumfix) must have the type
   prepended in the opstrings, e.g., "prefix:++" and "postcircumfix:{}".

   When a list is passed as an argument for any of the functions, it must
   be either an array reference or a scalar value that will be used as a
   single-element list.

   The following functions are provided but are not exported by default.

   reduce OPSTRING, LIST [, triangle => 1 ]
       "reducewith" is an alias for "reduce". It may be desirable to use
       "reducewith" to avoid naming conflicts or confusion with "reduce" in
       List::Util.

   zip OPSTRING, LIST1, LIST2
   zip LIST1, LIST2
       "zipwith" is an alias for "reduce".

   cross OPSTRING, LIST1, LIST2
   cross LIST1, LIST2
       "crosswith" is an alias for "reduce".

   hyper OPSTRING, LIST1, LIST2 [, dwim_left => 1, dwim_right => 1 ]
   hyper OPSTRING, LIST
       "hyperwith" is an alias for "reduce".

   applyop OPSTRING, OPERAND1, OPERAND2
   applyop OPSTRING, OPERAND
       If three arguments are provided to "applyop", apply the binary
       operator OPSTRING to the operands OPERAND1 and OPERAND2. If two
       arguments are provided, apply the unary operator OPSTRING to the
       operand OPERAND. The unary form defaults to using prefix operators,
       so 'prefix:' may be omitted, e.g., '++' instead of 'prefix:++';

           applyop '.', 'foo', 'bar'  # foobar
           applyop '++', 5            # 6

   reverseop OPSTRING, OPERAND1, OPERAND2
       "reverseop" provides the same functionality as "applyop" except that
       OPERAND1 and OPERAND2 are reversed.

           reverseop '.', 'foo', 'bar'  # barfoo

       If an unary opstring is used, "reverseop" has the same functionality
       as "applyop".

   The optional named-argument "flat" can be passed to "reduce", "zip",
   "cross", and "hyper". It defaults to 1, which causes the function to
   return a flat list. When set to 0, it causes the return value from each
   operator to be stored in an array ref, resulting in a "list of lists"
   being returned from the function.

       zip [1..3], ['a'..'c']             # 1, 'a', 2, 'b', 3, 'c'
       zip [1..3], ['a'..'c'], flat => 0  # [1, 'a'], [2, 'b'], [3, 'c']

TODO
   *   Add "warn"ings on errors instead of simply "return"ing

   *   Add named unary operators such as "uc" and "lc"

   *   Allow unlimited arrayrefs passed to "zip", "cross", and "hyper"
       instead of just two

   *   Support meta-operator literals such as "Z" and "X"

   *   Should the first argument optionally be a subroutine ref instead of
       an operator string?

   *   Should the "flat => 0" option be changed to "lol => 1"?

   *   Convert tests to TestML

SEE ALSO
   *   perlop

   *   "pairwise" in List::MoreUtils is similar to "zip" except that its
       first argument is a block instead of an operator string and the
       remaining arguments are arrays instead of array refs:

           pairwise { $a + $b }, @array1, @array2  # List::MoreUtils
           zip '+', \@array1, \@array2             # Operator::Util

   *   "mesh" a.k.a. "zip" in List::MoreUtils is similar to "zip" when
       using the default operator ',' except that the arguments are arrays
       instead of array refs:

           mesh @array1, @array2   # List::MoreUtils
           zip \@array1, \@array2  # Operator::Util

   *   Set::CrossProduct is an object-oriented alternative to "cross" when
       using the default operator ","

   *   The "Meta operators" section of Synopsis 3: Perl 6 Operators
       (<http://perlcabal.org/syn/S03.html#Meta_operators>) is the
       inspiration for this module

AUTHOR
   Nick Patch <[email protected]>

ACKNOWLEDGEMENTS
   *   This module is loosely based on the Perl 6 specification, as
       described in the Synopsis and implemented in Rakudo

   *   Much of the documentation is based on Synopsis 3: Perl 6 Operators
       (<http://perlcabal.org/syn/S03.html>)

   *   Most of the tests were forked from the Official Perl 6 Test Suite
       (<https://github.com/perl6/roast>)

COPYRIGHT AND LICENSE
   Copyright 2010, 2011 Nick Patch

   This library is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself.