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 103     103   4301 use 5.010;
  103         374  
  103         5460  
4              
5 103     103   779 use strict;
  103         198  
  103         7245  
6 103     103   567 use warnings;
  103         195  
  103         5599  
7              
8             # Don't accidentally turn carp/croak into methods.
9             require Carp::Fix::1_25;
10             require Hash::StoredIterator;
11              
12 103     103   604 use perl5i::2::Signatures;
  103         197  
  103         1001  
13              
14 103     103   15542 method each($callback) {
  8     8   644  
  8         13  
15 8         38 return Hash::StoredIterator::hmap( $callback, $self );
16             }
17              
18             sub flip {
19 6         163 Carp::Fix::1_25::croak("Can't flip hash with references as values")
20 3 100   3 0 687 if grep { ref } values %{$_[0]};
  3         9  
21              
22 2         3 my %flipped = reverse %{$_[0]};
  2         8  
23              
24 2 100       18 return wantarray ? %flipped : \%flipped;
25             }
26              
27             sub merge {
28 20     20 0 8188 require Hash::Merge::Simple;
29 20         2414 my $merged = Hash::Merge::Simple::merge(@_);
30              
31 20 100       644 return wantarray ? %$merged : $merged;
32             }
33              
34             sub print {
35 1     1 0 2057 my $hash = shift;
36 1         4 print join(" ", map { "$_ => $hash->{$_}" } keys %$hash);
  2         46  
37             }
38              
39             sub say {
40 1     1 0 139047 my $hash = shift;
41 1         5 print join(" ", map { "$_ => $hash->{$_}" } keys %$hash), "\n";
  2         89  
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 103     103   58183 no warnings 'uninitialized';
  103         237  
  103         43075  
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 1319 my ($base, @rest) = @_;
58 6 100       19 unless (@rest) {
59 2 50       17 return wantarray ? %$base : $base;
60             }
61              
62 4 100       6 die "Arguments must be hash references" if grep { ref $_ ne 'HASH' } @rest;
  5         25  
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         917 require perl5i::2::equal;
69              
70 3         11 foreach my $hash (@rest) {
71              
72 4         21 my $common_keys = $common->( [ keys %$base ], [ keys %$hash ] );
73              
74 4 100       69 next unless @$common_keys;
75              
76             # Keys are equal, are values also equal?
77 3         6 foreach my $key (@$common_keys) {
78 5 100       17 delete $base{$key} if perl5i::2::equal::are_equal( $base->{$key}, $hash->{$key} );
79             }
80              
81             }
82              
83 3 100       25 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 103     103   664 no warnings 'uninitialized';
  103         211  
  103         51941  
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 1822 my ($base, @rest) = @_;
100              
101 6 100       19 unless (@rest) {
102 2 50       15 return wantarray ? %$base : $base;
103             }
104              
105 4 100       9 die "Arguments must be hash references" if grep { ref $_ ne 'HASH' } @rest;
  5         30  
106              
107             # make a copy so that we can delete kv pairs without modifying the
108             # original hashref.
109 3         10 my %base = %$base;
110              
111 3         708 require perl5i::2::equal;
112              
113 3         9 foreach my $hash (@rest) {
114              
115 4         22 my $different_keys = $different->( [ keys %$base ], [ keys %$hash ] );
116              
117 4         19 delete @base{@$different_keys};
118              
119 4 50       19 return wantarray ? () : {} unless %base;
    100          
120              
121 3         16 my $common_keys = $common->( [ keys %$base ], [ keys %$hash ] );
122              
123             # Keys are equal, are values also equal?
124 3         8 foreach my $key (@$common_keys) {
125 5 100       18 delete $base{$key} unless perl5i::2::equal::are_equal( $base->{$key}, $hash->{$key} );
126             }
127              
128             }
129              
130 2 50       15 return wantarray ? %base : \%base;
131             }
132              
133             1;