NAME

    List::Keywords - a selection of list utility keywords

SYNOPSIS

       use List::Keywords 'any';
    
       my @boxes = ...;
    
       if( any { $_->size > 100 } @boxes ) {
          say "There are some large boxes here";
       }

DESCRIPTION

    This module provides keywords that behave (almost) identically to
    familiar functions from List::Util, but implemented as keyword plugins
    instead of functions. As a result these run more efficiently,
    especially in small code cases.

 Blocks vs Anonymous Subs

    In the description above the word "almost" refers to the fact that as
    this module provides true keywords, the code blocks to them can be
    parsed as true blocks rather than anonymous functions. As a result,
    both caller and return will behave rather differently here.

    For example,

       use List::Keywords 'any';
    
       sub func {
          any { say "My caller is ", caller; return "ret" } 1, 2, 3;
          say "This is never printed";
       }

    Here, the caller will see func as its caller, and the return statement
    makes the entire containing function return, so the second line is
    never printed. The same example written using List::Util will instead
    print the List::Util::any function as being the caller, before making
    just that one item return the value, then the message on the second
    line is printed as normal.

    In regular operation where the code is just performing some test on
    each item, and does not make use of caller or return, this should not
    cause any noticable differences.

 Performance

    The following example demonstrates a simple case and shows how the
    performance differs.

       my @nums = (1 .. 100);
    
       my $ret = any { $_ > 50 } @nums;

    When run for 5 seconds each, the following results were obtained on my
    machine:

       List::Util::any      648083/s
       List::Keyword/any    816135/s

    The List::Keyword version here ran 26% faster.

KEYWORDS

 first

       $val = first { CODE } LIST

    Since verison 0.03.

    Repeatedly calls the block of code, with $_ locally set to successive
    values from the given list. Returns the value and stops at the first
    item to make the block yield a true value. If no such item exists,
    returns undef.

       $val = first my $var { CODE } LIST

    Since version 0.09.

    Optionally the code block can be prefixed with a lexical variable
    declaration. In this case, that variable will contain each value from
    the list, and the global $_ will remain untouched.

 any

       $bool = any { CODE } LIST

    Repeatedly calls the block of code, with $_ locally set to successive
    values from the given list. Returns true and stops at the first item to
    make the block yield a true value. If no such item exists, returns
    false.

       $val = any my $var { CODE } LIST

    Since version 0.09.

    Uses the lexical variable instead of global $_, similar to "first".

 all

       $bool = all { CODE } LIST

    Repeatedly calls the block of code, with $_ locally set to successive
    values from the given list. Returns false and stops at the first item
    to make the block yield a false value. If no such item exists, returns
    true.

       $val = all my $var { CODE } LIST

    Since version 0.09.

    Uses the lexical variable instead of global $_, similar to "first".

 none

 notall

       $bool = none { CODE } LIST
       $bool = notall { CODE } LISt

    Since verison 0.03.

    Same as "any" and "all" but with the return value inverted.

       $val = none my $var { CODE } LIST
       $val = notall my $var { CODE } LIST

    Since version 0.09.

    Uses the lexical variable instead of global $_, similar to "first".

 reduce

       $final = reduce { CODE } INITIAL, LIST

    Since verison 0.05.

    Repeatedly calls a block of code, using the $a package lexical as an
    accumulator and setting $b to each successive value from the list in
    turn. The first value of the list sets the initial value of the
    accumulator, and each returned result from the code block gives its new
    value. The final value of the accumulator is returned.

 reductions

       @partials = reductions { CODE } INITIAL, LIST

    Since version 0.06.

    Similar to reduce, but returns a full list of all the partial results
    of every invocation, beginning with the initial value itself and ending
    with the final result.

TODO

    More functions from List::Util:

       pairfirst pairgrep pairmap

    Maybe also consider some from List::UtilsBy.

ACKNOWLEDGEMENTS

    With thanks to Matthew Horsfall (alh) for much assistance with
    performance optimizations.

AUTHOR

    Paul Evans <leonerd@leonerd.org.uk>

