From 7c12bca644bcbdc39c920290f7819f64d1a45ab4 Mon Sep 17 00:00:00 2001 From: Samantha McVey Date: Mon, 24 Apr 2017 23:26:41 -0700 Subject: Add support for replacing and not appending the array. Add POD6 --- lib/mergehash.pm6 | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/mergehash.pm6 b/lib/mergehash.pm6 index cc9b9cb..1db7e60 100644 --- a/lib/mergehash.pm6 +++ b/lib/mergehash.pm6 @@ -1,24 +1,32 @@ use MONKEY; augment class Hash { - method merge (%b) { - hashmerge self, %b; + #|Merges one a second hash into the hash the method is called on + #|Traverses the full tree, replacing items in the original hash with the + #|hash given in the argument. Does not replace positional elements by default, + #|and instead appends the items from the supplied hash's array to the original + #| hash's array. Use :no-append-array to replace arrays and positionals instead + #|The object type of positionals is not retained and instead becomes an Array type + method merge (%b; Bool:D :$no-append-array = False) { + hashmerge self, %b, :$no-append-array; } - sub hashmerge (%merge-into, %merge-source) { + sub hashmerge (%merge-into, %merge-source, Bool:D :$no-append-array) { for %merge-source.keys -> $key { if %merge-into{$key}:exists { if %merge-source{$key} ~~ Hash { - hashmerge %merge-into{$key}, %merge-source{$key}; + hashmerge %merge-into{$key}, %merge-source{$key}, :$no-append-array; } elsif %merge-source{$key} ~~ Positional { - my @a; - for %merge-into{$key}.list { - @a.push: $_; + if $no-append-array { + %merge-into{$key} = %merge-source{$key}; } - for %merge-source{$key}.list { - @a.push: $_; + else { + my @a; + @a.push: $_ for %merge-into{$key}.list; + @a.push: $_ for %merge-source{$key}.list; + %merge-into{$key} = @a; } - %merge-into{$key} = @a; } + # Non-positionals, so strings or Bools or whatever else { %merge-into{$key} = %merge-source{$key}; } -- cgit v1.1