File Coverage

blib/lib/Math/Subsets/List.pm
Criterion Covered Total %
statement 23 23 100.0
branch 2 2 100.0
condition n/a
subroutine 4 4 100.0
pod 0 1 0.0
total 29 30 96.6


line stmt bran cond sub pod time code
1             =head1 Name
2            
3             Math::Subsets::List - Generate all the subsets of a list.
4            
5             =head1 Synopsis
6            
7             use Math::Subsets::List;
8            
9             subsets {say "@_"} qw(a b c);
10            
11             #
12             # a
13             # b
14             # c
15             # a b
16             # a c
17             # b c
18             # a b c
19            
20             =cut
21            
22             package Math::Subsets::List;
23            
24 11     11   260070 use strict;
  11         24  
  11         1980  
25            
26 10     10 0 159 sub subsets(&@)
27             {my $s = shift; # Subroutine to call to process each subset
28            
29 10         26 my $n = scalar(@_); # Size of list to be subsetted
30 10         23 my $l = 0; # Current item
31 10         27 my @p = (); # Current subset
32 10         33 my @P = @_; # List to be subsetted
33            
34 10         59 my $p; $p = sub # Generate each subset
  1096         924  
35 2200 100   2200   3172 {if ($l < $n)
36 1104         1907 {++$l;
37 1096         1404 &$p();
38 1094         2042 push @p, $P[$l-1];
39 1094         1315 &$p();
40 1094         1572 pop @p;
41 1094         1132 --$l
42             }
43             else
44             {&$s(@p)
45             }
46 10         87 };
47            
48 10         44 &$p;
49            
50 9         86 2**$n;
51             }
52            
53             # Export details
54            
55             require 5;
56             require Exporter;
57            
58 11     11   60 use vars qw(@ISA @EXPORT $VERSION);
  11         22  
  11         1297  
59            
60             @ISA = qw(Exporter);
61             @EXPORT = qw(subsets);
62             # 1.004 # Saturday 21 March 2009
63             $VERSION = '1.006'; # Mondday 27 August 2012
64            
65             =head1 Description
66            
67             Generate all the subsets of a list and process them using the standard
68             Perl metaphor.
69            
70             C returns the number of subsets. Please note that this
71             includes the empty set as it is a subset of all sets.
72            
73             Please note that the order in which the subsets are generated is
74             not guaranteed, so please do not rely on it.
75            
76             C is easy to use and fast. It is written in 100% Pure Perl.
77            
78             =head1 Export
79            
80             The C function is exported.
81            
82             =head1 Installation
83            
84             Standard Module::Build process for building and installing modules:
85            
86             perl Build.PL
87             ./Build
88             ./Build test
89             ./Build install
90            
91             Or, if you're on a platform (like DOS or Windows) that doesn't require
92             the "./" notation, you can do this:
93            
94             perl Build.PL
95             Build
96             Build test
97             Build install
98            
99             =head1 Author
100            
101             PhilipRBrenan@gmail.com
102            
103             =head1 See Also
104            
105            
106             =over
107            
108             =item L
109            
110             =item L
111            
112             =item L
113            
114             =back
115            
116             =head1 Copyright
117            
118             Copyright (c) 2009 Philip R Brenan.
119            
120             This module is free software. It may be used, redistributed and/or
121             modified under the same terms as Perl itself.
122            
123             =cut
124            
125             1;
126             __END__