# Pastebin Ntrrr2GH $ git diff | cat diff --git a/src/core/hash_slice.pm b/src/core/hash_slice.pm index 2c9a76a..cd08973 100644 --- a/src/core/hash_slice.pm +++ b/src/core/hash_slice.pm @@ -206,15 +206,25 @@ multi sub postcircumfix:<{; }>(\SELF, @indices) { nqp::p6bindattrinvres(nqp::create(List), List, '$!reified', target) } -multi sub postcircumfix:<{; }>(\SELF, @indices, :$exists!) { - sub recurse-at-key(\SELF, \indices, \counter){ - my $idx = indices[counter]; - (counter < indices.elems) - ?? SELF.EXISTS-KEY($idx) && recurse-at-key(SELF{$idx}, indices, counter + 1) - !! True - } +multi postcircumfix:<{; }>(\SELF, @indices, :$exists!) { + multi recurse-at-key(\SELF, \indices, 0) { + (False xx indices.map(*.elems).reduce(&infix:<*>)).List + } + multi recurse-at-key(\SELF, [@idx, +@indices]) { + @idx.map( -> $idx { |recurse-at-key(SELF, ($idx, |@indices)) }).List + } + multi recurse-at-key(\SELF, [$idx, +@indices where *.elems > 0]) { + nqp::if( + nqp::not_i(SELF.EXISTS-KEY($idx)), + recurse-at-key(SELF{$idx}, @indices, 0), + recurse-at-key(SELF{$idx}, @indices), + ) + } + multi recurse-at-key(\SELF, [$idx]) { + SELF.EXISTS-KEY($idx) + } - recurse-at-key(SELF, @indices, 0) + recurse-at-key(SELF, @indices) } # vim: ft=perl6 expandtab sw=4