Florian Ragwitz > List-Gather-0.06 > List::Gather

Download:
List-Gather-0.06.tar.gz

Dependencies

Annotate this POD

Website

CPAN RT

Open  1
View/Report Bugs
Module Version: 0.06   Source   Latest Release: List-Gather-0.08

NAME ^

List::Gather - Construct lists procedurally without temporary variables

SYNOPSIS ^

  use List::Gather;

  my @list = gather {
      while (<$fh>) {
          next if /^\s*$/;
          next if /^\s*#/;
          last if /^(?:__END__|__DATA__)$/;
          take $_ if some_predicate($_);
      }

      take @defaults unless gathered;
  };

DESCRIPTION ^

This module provides a gather keyword that allows lists to be constructed procedurally, without the need for a temporary variable.

Within the block controlled by a gather any call to take pushes that call's argument list to an implicitly created array.

gather returns the list of values taken during its block's execution.

FUNCTIONS ^

gather

  gather { ... }
  gather({ ... })

Executes the block it has been provided with, collecting all arguments passed to take calls within it. After execution, the list of values collected is returned.

Note that block gather executes is equivalent to a do BLOCK. It is neither a code nor a loop. Loop control keywords, such as next and last, as well as return will behave accordingly.

Parens around the gather block are optional.

take

  take LIST

Collects a LIST of values within the gather block it has been compiled in.

take returns no meaningful value.

take calls outside of the lexical scope of a gather block are compile time errors. Calling take is only legal within the dynamic scope its associated gather block.

gathered

  gathered

Returns the list of items collected so far during the execution of a gather block.

gathered calls outside of the lexical scope of a gather block are compile time errors. Calling gathered outside of the dynamic scope of its associated gather block is legal.

EXAMPLES ^

  my @interesting_child_nodes = gather {
      for my $n (@nodes) {
          take $n->all_children
              if $n->is_interesting;
      }
  };

  my @last_10_events = gather {
      while ($log->has_event) {
          take $log->next_event;
      }

      shift gathered while gathered > 10;
  };

  my @search_results = gather {
      $user_interface->register_status_callback(sub {
          sprintf "Searching... Found %d matches so far", scalar gathered;
      });

      wait_for_search_results(sub {
          my ($result) = @_;
          take $result;
      }, @search_terms);

      $user_interface->register_status_callback(sub {
          sprintf "Found a total of %d", scalar gathered;
      });
  };

  my @leaf_nodes = gather {
      $graph->visit_all_nodes_recursively(sub {
          my ($node) = @_;
          take $node if $node->is_leaf;
      }
  };

SEE ALSO ^

Syntax::Keyword::Gather

A non-lexical gather/take implementation that's otherwise very similar to this one

Perl6::GatherTake

An experimental implementation of a lazily evaluating gather/take

Perl6::Take

A very simple gather/take implementation without lexical scoping

Perl6::Gather

Like Syntax::Keyword::Gather, but reliant on Perl6::Export

List::Gen

A comprehensive suit list generation functions featuring a non-lexical gather/take

ACKNOWLEDGEMENTS ^

AUTHOR ^

Florian Ragwitz <rafl@debian.org>

COPYRIGHT AND LICENSE ^

This software is copyright (c) 2012 by Florian Ragwitz.

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

syntax highlighting: