File Coverage

blib/lib/Set/Tiny.pm
Criterion Covered Total %
statement 67 67 100.0
branch 15 16 93.7
condition 5 5 100.0
subroutine 27 27 100.0
pod 25 25 100.0
total 139 140 99.2


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