File Coverage

blib/lib/perl5i/2/HASH.pm
Criterion Covered Total %
statement 65 65 100.0
branch 28 32 87.5
condition n/a
subroutine 14 14 100.0
pod 0 6 0.0
total 107 117 91.4


line stmt bran cond sub pod time code
1             # vi: set ts=4 sw=4 ht=4 et :
2             package perl5i::2::HASH;
3 101     101   2469 use 5.010;
  101         257  
  101         3723  
4              
5 101     101   493 use strict;
  101         121  
  101         3333  
6 101     101   384 use warnings;
  101         111  
  101         4289  
7              
8             # Don't accidentally turn carp/croak into methods.
9             require Carp::Fix::1_25;
10             require Hash::StoredIterator;
11              
12 101     101   430 use perl5i::2::Signatures;
  101         128  
  101         715  
13              
14 101     101   10574 method each($callback) {
  8     8   537  
  8         6  
15 8         27 return Hash::StoredIterator::hmap( $callback, $self );
16             }
17              
18             sub flip {
19 6         178 Carp::Fix::1_25::croak("Can't flip hash with references as values")
20 3 100   3 0 493 if grep { ref } values %{$_[0]};
  3         13  
21              
22 2         3 my %flipped = reverse %{$_[0]};
  2         7  
23              
24 2 100       14 return wantarray ? %flipped : \%flipped;
25             }
26              
27             sub merge {
28 20     20 0 1255 require Hash::Merge::Simple;
29 20         949 my $merged = Hash::Merge::Simple::merge(@_);
30              
31 20 100       466 return wantarray ? %$merged : $merged;
32             }
33              
34             sub print {
35 1     1 0 1369 my $hash = shift;
36 1         3 print join(" ", map { "$_ => $hash->{$_}" } keys %$hash);
  2         32  
37             }
38              
39             sub say {
40 1     1 0 1102 my $hash = shift;
41 1         3 print join(" ", map { "$_ => $hash->{$_}" } keys %$hash), "\n";
  2         70  
42             }
43              
44             my $common = sub {
45             # Return all things in first array that are also present in second.
46             my ($c, $d) = @_;
47              
48 101     101   35647 no warnings 'uninitialized';
  101         166  
  101         26345  
49             my %seen = map { $_ => 1 } @$d;
50              
51             my @common = grep { $seen{$_} } @$c;
52              
53             return \@common;
54             };
55              
56             sub diff {
57 6     6 0 1050 my ($base, @rest) = @_;
58 6 100       15 unless (@rest) {
59 2 50       14 return wantarray ? %$base : $base;
60             }
61              
62 4 100       7 die "Arguments must be hash references" if grep { ref $_ ne 'HASH' } @rest;
  5         24  
63              
64             # make a copy so that we can delete kv pairs without modifying the
65             # original hashref.
66 3         9 my %base = %$base;
67              
68 3         426 require perl5i::2::equal;
69              
70 3         7 foreach my $hash (@rest) {
71              
72 4         18 my $common_keys = $common->( [ keys %$base ], [ keys %$hash ] );
73              
74 4 100       15 next unless @$common_keys;
75              
76             # Keys are equal, are values also equal?
77 3         5 foreach my $key (@$common_keys) {
78 5 100       13 delete $base{$key} if perl5i::2::equal::are_equal( $base->{$key}, $hash->{$key} );
79             }
80              
81             }
82              
83 3 100       19 return wantarray ? %base : \%base;
84             }
85              
86             my $different = sub {
87             # Return all things in first array that are not present in second.
88             my ($c, $d) = @_;
89              
90 101     101   540 no warnings 'uninitialized';
  101         238  
  101         26155  
91             my %seen = map { $_ => 1 } @$d;
92              
93             my @different = grep { not $seen{$_} } @$c;
94              
95             return \@different;
96             };
97              
98             sub intersect {
99 6     6 0 1013 my ($base, @rest) = @_;
100              
101 6 100       14 unless (@rest) {
102 2 50       13 return wantarray ? %$base : $base;
103             }
104              
105 4 100       6 die "Arguments must be hash references" if grep { ref $_ ne 'HASH' } @rest;
  5         27  
106              
107             # make a copy so that we can delete kv pairs without modifying the
108             # original hashref.
109 3         9 my %base = %$base;
110              
111 3         523 require perl5i::2::equal;
112              
113 3         6 foreach my $hash (@rest) {
114              
115 4         13 my $different_keys = $different->( [ keys %$base ], [ keys %$hash ] );
116              
117 4         8 delete @base{@$different_keys};
118              
119 4 50       12 return wantarray ? () : {} unless %base;
    100          
120              
121 3         11 my $common_keys = $common->( [ keys %$base ], [ keys %$hash ] );
122              
123             # Keys are equal, are values also equal?
124 3         6 foreach my $key (@$common_keys) {
125 5 100       11 delete $base{$key} unless perl5i::2::equal::are_equal( $base->{$key}, $hash->{$key} );
126             }
127              
128             }
129              
130 2 50       10 return wantarray ? %base : \%base;
131             }
132              
133             1;