File Coverage

blib/lib/Set/Tiny.pm
Criterion Covered Total %
statement 72 72 100.0
branch 17 18 94.4
condition 5 5 100.0
subroutine 28 28 100.0
pod 25 25 100.0
total 147 148 99.3


line stmt bran cond sub pod time code
1             package Set::Tiny;
2 3     3   363835 use strict;
  3         6  
  3         108  
3 3     3   12 use warnings;
  3         14  
  3         226  
4              
5             our $VERSION = '0.06';
6              
7 3     3   25 use Exporter 'import';
  3         5  
  3         3226  
8             our @EXPORT_OK = qw(set);
9              
10             sub new {
11 26     26 1 236501 my $class = shift;
12 26         35 my %self;
13 26         67 @self{@_} = ();
14 26         80 return bless \%self, $class;
15             }
16              
17             sub set { ## no critic (NamingConventions::ProhibitAmbiguousNames)
18 4 100   4 1 174670 if ( ref( $_[0] ) eq 'Set::Tiny' ) {
    100          
19 1         4 return $_[0]->clone();
20             }
21             elsif ( ref( $_[0] ) eq 'ARRAY' ) {
22 1         1 return Set::Tiny->new( @{ $_[0] } );
  1         5  
23             }
24             else {
25 2         12 return Set::Tiny->new(@_);
26             }
27             }
28              
29 98     98 1 2027 sub as_string { '(' . join( ' ', sort keys %{ $_[0] } ) . ')' }
  98         680  
30              
31 30     30 1 928 sub size { scalar keys %{ $_[0] } }
  30         165  
32              
33 3 100   3 1 848 sub element { exists $_[0]->{ $_[1] } ? $_[1] : () }
34              
35 3     3 1 6 sub elements { keys %{ $_[0] } }
  3         28  
36              
37             sub contains {
38 20     20 1 1180 my $self = shift;
39 20   100     97 exists $self->{$_} or return !!0 for @_;
40 15         98 return !!1;
41             }
42              
43             sub clone {
44 10     10 1 22 my $class = ref $_[0];
45 10         17 return $class->new( keys %{ $_[0] } );
  10         33  
46             }
47              
48             sub clear {
49 2     2 1 5 %{ $_[0] } = ();
  2         8  
50 2         5 return $_[0];
51             }
52              
53             sub insert {
54 1     1 1 3 my $self = shift;
55 1         2 @{$self}{@_} = ();
  1         5  
56 1         3 return $self;
57             }
58              
59             sub remove {
60 7     7 1 15 my $self = shift;
61 7         33 delete @{$self}{@_};
  7         18  
62 7         20 return $self;
63             }
64              
65             sub invert {
66 3     3 1 7 my $self = shift;
67 3 100       18 exists $self->{$_} ? delete $self->{$_} : ( $self->{$_} = undef ) for @_;
68 3         9 return $self;
69             }
70              
71 3     3 1 1456 sub is_null { !%{ $_[0] } }
  3         17  
72              
73 15     15 1 27 sub is_subset { $_[1]->contains( keys %{ $_[0] } ) }
  15         50  
74              
75 4 100   4 1 13 sub is_proper_subset { $_[0]->size < $_[1]->size && $_[0]->is_subset( $_[1] ) }
76              
77 4     4 1 15 sub is_superset { $_[1]->is_subset( $_[0] ) }
78              
79             sub is_proper_superset {
80 4 100   4 1 15 $_[0]->size > $_[1]->size && $_[1]->is_subset( $_[0] );
81             }
82              
83 3 100   3 1 12 sub is_equal { $_[1]->is_subset( $_[0] ) && $_[0]->is_subset( $_[1] ) }
84              
85 7     7 1 755 sub is_disjoint { !$_[0]->intersection( $_[1] )->size }
86              
87             sub is_properly_intersecting {
88 4 100 100 4 1 417 !$_[0]->is_disjoint( $_[1] )
89             && $_[0]->difference( $_[1] )->size
90             && $_[1]->difference( $_[0] )->size;
91             }
92              
93 5     5 1 15 sub difference { $_[0]->clone->remove( keys %{ $_[1] } ) }
  5         14  
94              
95             sub union {
96 1     1 1 4 my $class = ref $_[0];
97 1         2 return $class->new( keys %{ $_[0] }, keys %{ $_[1] } );
  1         4  
  1         5  
98             }
99              
100             sub intersection {
101 8     8 1 18 my $class = ref $_[0];
102 8         17 return $class->new( grep { exists( $_[0]->{$_} ) } keys %{ $_[1] } );
  18         47  
  8         25  
103             }
104              
105             sub intersection2 {
106 1     1 1 6 my $class = ref $_[0];
107 1 50       4 my ( $a, $b ) =
108             $_[0]->size > $_[1]->size ? ( $_[0], $_[1] ) : ( $_[1], $_[0] );
109 1         2 return $class->new( grep { exists( $a->{$_} ) } keys %{$b} );
  3         8  
  1         3  
110             }
111              
112 2     2 1 10 sub symmetric_difference { $_[0]->clone->invert( keys %{ $_[1] } ) }
  2         7  
113              
114             {
115             *copy = \&clone;
116             *has = \&contains;
117             *member = \&element;
118             *members = \&elements;
119             *delete = \&remove;
120             *is_empty = \&is_null;
121             *unique = \&symmetric_difference;
122             }
123              
124             1;
125              
126             __END__