File Coverage

blib/lib/Data/MuForm/Merge.pm
Criterion Covered Total %
statement 25 25 100.0
branch 12 12 100.0
condition n/a
subroutine 5 5 100.0
pod 0 2 0.0
total 42 44 95.4


line stmt bran cond sub pod time code
1             package Data::MuForm::Merge;
2             # ABSTRACT: internal hash merging
3 93     93   357 use warnings;
  93         209  
  93         2686  
4 93     93   301 use Data::Clone ('data_clone');
  93         124  
  93         3720  
5 93     93   327 use base 'Exporter';
  93         126  
  93         38554  
6              
7             our @EXPORT_OK = ( 'merge' );
8              
9             our $matrix = {
10             'SCALAR' => {
11             'SCALAR' => sub { $_[0] },
12             'ARRAY' => sub { [ $_[0], @{ $_[1] } ] },
13             'HASH' => sub { $_[1] },
14             },
15             'ARRAY' => {
16             'SCALAR' => sub { [ @{ $_[0] }, $_[1] ] },
17             'ARRAY' => sub { [ @{ $_[0] }, @{ $_[1] } ] },
18             'HASH' => sub { $_[1] },
19             },
20             'HASH' => {
21             'SCALAR' => sub { $_[0] },
22             'ARRAY' => sub { $_[0] },
23             'HASH' => sub { merge_hashes( $_[0], $_[1] ) },
24             },
25             };
26              
27             sub merge {
28 219     219 0 364 my ( $left, $right ) = @_;
29              
30 219 100       476 my $lefttype =
    100          
31             ref $left eq 'HASH' ? 'HASH' :
32             ref $left eq 'ARRAY' ? 'ARRAY' :
33             'SCALAR';
34 219 100       292 my $righttype =
    100          
35             ref $right eq 'HASH' ? 'HASH' :
36             ref $right eq 'ARRAY' ? 'ARRAY' :
37             'SCALAR';
38 219         817 $left = data_clone($left);
39 219         1455 $right = data_clone($right);
40 219         531 return $matrix->{$lefttype}{$righttype}->( $left, $right );
41             }
42              
43             sub merge_hashes {
44 201     201 0 184 my ( $left, $right ) = @_;
45 201         143 my %newhash;
46 201         355 foreach my $leftkey ( keys %$left ) {
47 136 100       181 if ( exists $right->{$leftkey} ) {
48 24         48 $newhash{$leftkey} = merge( $left->{$leftkey}, $right->{$leftkey} );
49             }
50             else {
51 112         264 $newhash{$leftkey} = data_clone( $left->{$leftkey} );
52             }
53             }
54 201         470 foreach my $rightkey ( keys %$right ) {
55 2311 100       2672 if ( !exists $left->{$rightkey} ) {
56 2287         3713 $newhash{$rightkey} = data_clone( $right->{$rightkey} );
57             }
58             }
59 201         907 return \%newhash;
60             }
61              
62             1;
63              
64             __END__
65              
66             =pod
67              
68             =encoding UTF-8
69              
70             =head1 NAME
71              
72             Data::MuForm::Merge - internal hash merging
73              
74             =head1 VERSION
75              
76             version 0.04
77              
78             =head1 AUTHOR
79              
80             Gerda Shank
81              
82             =head1 COPYRIGHT AND LICENSE
83              
84             This software is copyright (c) 2017 by Gerda Shank.
85              
86             This is free software; you can redistribute it and/or modify it under
87             the same terms as the Perl 5 programming language system itself.
88              
89             =cut