File Coverage

blib/lib/List/Collection.pm
Criterion Covered Total %
statement 11 43 25.5
branch 0 6 0.0
condition 0 3 0.0
subroutine 4 9 44.4
pod 5 5 100.0
total 20 66 30.3


line stmt bran cond sub pod time code
1             package List::Collection;
2 2     2   5373 use Modern::Perl;
  2         4  
  2         16  
3 2     2   307 use Exporter;
  2         4  
  2         74  
4 2     2   1869 use Sort::Naturally;
  2         10396  
  2         1209  
5              
6             our $VERSION = '0.0.4'; # VERSION
7             # ABSTRACT: List::Collection
8              
9              
10             our @ISA = qw/Exporter/;
11             our @EXPORT = qw/intersect union subtract complement/;
12              
13              
14             sub new {
15 1     1 1 2435 my $class = shift;
16 1         4 return bless { @_ }, $class;
17             }
18              
19             sub _remove_obj {
20 0 0   0     return if @_ == 0;
21 0 0 0       shift if ($_[0] and ref $_[0] eq __PACKAGE__);
22 0           return @_;
23             }
24              
25              
26             sub intersect {
27 0     0 1   my @lists = _remove_obj(@_);
28 0           my $list_count = @lists;
29 0           my (%elements, @out);
30 0           for my $list (@lists) {
31 0           $elements{$_}++ for (@$list);
32             }
33 0           for my $key (sort keys %elements) {
34 0 0         push (@out, $key) if $elements{$key} == $list_count;
35             }
36 0           @out = nsort(@out);
37 0           return @out;
38             }
39              
40              
41             sub union {
42 0     0 1   my @lists = _remove_obj(@_);
43 0           my (%elements, @out);
44 0           for my $list (@lists) {
45 0           $elements{$_} = 1 for (@$list);
46             }
47 0           @out = nsort(keys %elements);
48 0           return @out;
49             }
50              
51              
52             sub subtract {
53 0     0 1   my @lists = _remove_obj(@_);
54 0           my %elements;
55 0           $elements{$_} = 1 for (@{$lists[0]});
  0            
56 0           delete $elements{$_} for (@{$lists[1]});
  0            
57 0           my @out = nsort(keys %elements);
58 0           return @out;
59             }
60              
61              
62             sub complement {
63 0     0 1   my @lists = _remove_obj(@_);
64 0           my @union = union(@lists);
65 0           my @intersect = intersect(@lists);
66 0           my @out = subtract(\@union, \@intersect);
67 0           @out = nsort(@out);
68 0           return @out;
69             }
70              
71             1;
72              
73             __END__