File Coverage

blib/lib/Hash/Util/Join/PP.pm
Criterion Covered Total %
statement 68 68 100.0
branch 22 22 100.0
condition 14 21 66.6
subroutine 18 18 100.0
pod 0 9 0.0
total 122 138 88.4


line stmt bran cond sub pod time code
1             package Hash::Util::Join::PP;
2 4     4   346273 use strict;
  4         7  
  4         197  
3 4     4   25 use warnings;
  4         7  
  4         289  
4              
5 4     4   36 use Exporter qw[import];
  4         6  
  4         162  
6 4     4   1936 use Hash::Util::Set qw[:operations];
  4         13  
  4         5147  
7              
8             our $VERSION = '0.07';
9             our @EXPORT_OK = qw[ hash_inner_join
10             hash_left_join
11             hash_right_join
12             hash_outer_join
13             hash_left_anti_join
14             hash_right_anti_join
15             hash_full_anti_join
16             hash_partition
17             hash_partition_by ];
18              
19             our %EXPORT_TAGS = ( all => \@EXPORT_OK );
20              
21             sub hash_inner_join(\%\%;&) {
22 4028     4028 0 8514022 my ($x, $y, $merge_fn) = @_;
23 4028   66 32478   24020 $merge_fn //= sub { $_[2] };
  32478         53783  
24 4028         7409 my %result;
25 4028         14681 foreach my $k (keys_intersection %$x, %$y) {
26 64455         176083 $result{$k} = $merge_fn->($k, $x->{$k}, $y->{$k});
27             }
28 4027 100       46320 return wantarray ? %result : \%result;
29             }
30              
31             sub hash_left_join(\%\%;&) {
32 2006     2006 0 1915667 my ($x, $y, $merge_fn) = @_;
33 2006   66 63824   17352 $merge_fn //= sub { $_[2] // $_[1] };
  63824   66     144673  
34 2006         3616 my %result;
35 2006         13932 foreach my $k (keys %$x) {
36 63827         155363 $result{$k} = $merge_fn->($k, $x->{$k}, $y->{$k});
37             }
38 2006 100       28374 return wantarray ? %result : \%result;
39             }
40              
41             sub hash_right_join(\%\%;&) {
42 2004     2004 0 2071894 my ($x, $y, $merge_fn) = @_;
43 2004   66 64226   16906 $merge_fn //= sub { $_[2] // $_[1] };
  64226   66     136920  
44 2004         3481 my %result;
45 2004         14572 foreach my $k (keys %$y) {
46 64229         147882 $result{$k} = $merge_fn->($k, $x->{$k}, $y->{$k});
47             }
48 2004 100       28394 return wantarray ? %result : \%result;
49             }
50              
51             sub hash_outer_join(\%\%;&) {
52 2014     2014 0 2282552 my ($x, $y, $merge_fn) = @_;
53 2014   66 96100   17598 $merge_fn //= sub { $_[2] // $_[1] };
  96100   66     210306  
54 2014         4333 my %result;
55 2014         8424 foreach my $k (keys_union %$x, %$y) {
56 96116         200734 $result{$k} = $merge_fn->($k, $x->{$k}, $y->{$k});
57             }
58 2014 100       35217 return wantarray ? %result : \%result;
59             }
60              
61             sub hash_left_anti_join(\%\%) {
62 2006     2006 0 2022339 my ($x, $y) = @_;
63 2006         9571 my %result = map { $_ => $x->{$_} } keys_difference %$x, %$y;
  31866         65509  
64 2006 100       22561 return wantarray ? %result : \%result;
65             }
66              
67             sub hash_right_anti_join(\%\%) {
68 2004     2004 0 1737477 my ($x, $y) = @_;
69 2004         8919 my %result = map { $_ => $y->{$_} } keys_difference %$y, %$x;
  32269         66575  
70 2004 100       21299 return wantarray ? %result : \%result;
71             }
72              
73             sub hash_full_anti_join(\%\%) {
74 2007     2007 0 1914261 my ($x, $y) = @_;
75 2007         4514 my %result;
76 2007         9688 foreach my $k (keys_symmetric_difference %$x, %$y) {
77 64138 100       147597 $result{$k} = exists $x->{$k} ? $x->{$k} : $y->{$k};
78             }
79 2007 100       23000 return wantarray ? %result : \%result;
80             }
81              
82             sub hash_partition(\%&) {
83 10     10 0 239795 my ($h, $predicate_fn) = @_;
84 10         25 my (%true, %false);
85 10         37 foreach my $k (keys %$h) {
86 26 100       88 if ($predicate_fn->($k, $h->{$k})) {
87 15         92 $true{$k} = $h->{$k};
88             } else {
89 10         60 $false{$k} = $h->{$k};
90             }
91             }
92 9         35 return (\%true, \%false);
93             }
94              
95             sub hash_partition_by(\%&) {
96 17     17 0 32890 my ($h, $classify_fn) = @_;
97 17         43 my %result;
98 17         71 foreach my $k (keys %$h) {
99 141         314 my $bucket = $classify_fn->($k, $h->{$k});
100 140 100       548 next unless defined $bucket;
101 137         449 $result{$bucket}{$k} = $h->{$k};
102             }
103 16 100       130 return wantarray ? %result : \%result;
104             }
105              
106             BEGIN {
107 4     4   175 delete @Hash::Util::Join::PP::{qw[ keys_union
108             keys_intersection
109             keys_difference
110             keys_symmetric_difference
111             keys_partition ]};
112             }
113              
114             1;