File Coverage

blib/lib/Scalar/Induce.pm
Criterion Covered Total %
statement 21 21 100.0
branch n/a
condition n/a
subroutine 7 7 100.0
pod 2 2 100.0
total 30 30 100.0


line stmt bran cond sub pod time code
1             package Scalar::Induce;
2             {
3             $Scalar::Induce::VERSION = '0.05';
4             }
5              
6 2     2   80535 use 5.006;
  2         7  
  2         94  
7 2     2   12 use strict;
  2         3  
  2         68  
8 2     2   11 use warnings;
  2         5  
  2         90  
9              
10             ##no critic (ProhibitAutomaticExportation)
11 2     2   10 use Exporter 5.57 'import';
  2         41  
  2         59  
12 2     2   11 use XSLoader;
  2         3  
  2         263  
13             our @EXPORT = qw/induce void/;
14             if (!(not our $pure_perl and eval { XSLoader::load('Scalar::Induce', __PACKAGE__->VERSION); 1 })) {
15             require Carp;
16 5     5 1 7507 eval <<'END' or Carp::croak("Could not load pure-perl induce: $@"); ##no critic (ProhibitStringyEval)
  5     9 1 8  
  5         15  
  5         25  
  5         422  
  9         3527  
17             sub induce (&$) {
18             my ( $c, $v ) = @_;
19             my @r;
20             for ( $v ) { push @r, $c->() while defined }
21             @r;
22             }
23             sub void { return; }
24             1;
25             END
26             }
27              
28             1;
29              
30             #ABSTRACT: Unfolding scalars
31              
32              
33              
34             =pod
35              
36             =head1 NAME
37              
38             Scalar::Induce - Unfolding scalars
39              
40             =head1 VERSION
41              
42             version 0.05
43              
44             =head1 SYNOPSIS
45              
46             my @reversed = induce { @$_ ? pop @$_ : void undef $_ } [ 1 .. 10 ];
47              
48             my @chunks = induce { (length) ? substr $_, 0, 3, '' : void undef $_ } "foobarbaz";
49              
50             =head1 FUNCTIONS
51              
52             All functions are exported by default.
53              
54             =head2 induce
55              
56             This function takes a block and a scalar as arguments and then repeatedly applies the block to the value, accumulating the return values to eventually return them as a list. It does the opposite of reduce, hence its name. It's called unfold in some other languages.
57              
58             =head2 void
59              
60             This is a utility function that always returns an empty list (or undefined in scalar context). This makes a lot of inductions simpler.
61              
62             =head1 ACKNOWLEDGEMENTS
63              
64             Aristotle Pagaltzis came up with this idea (L). Leon Timmermans re-implemented it in XS and uploaded it to CPAN.
65              
66             =head1 AUTHOR
67              
68             Leon Timmermans
69              
70             =head1 COPYRIGHT AND LICENSE
71              
72             This software is copyright (c) 2009 by Leon Timmermans.
73              
74             This is free software; you can redistribute it and/or modify it under
75             the same terms as the Perl 5 programming language system itself.
76              
77             =cut
78              
79              
80             __END__