Skip to content

Commit

Permalink
Correct behaviour on QuantHash>>--
Browse files Browse the repository at this point in the history
On more thoroughly grokking

   https://docs.raku.org/language/operators#methodop_»._/_methodop_%3E%3E

this commit changes the functionality to be in concordance to the
documentation and related tests on Hashes.

See also Raku/problem-solving#345
  • Loading branch information
lizmat committed Sep 14, 2022
1 parent 63d03eb commit d0ec99a
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 15 deletions.
27 changes: 21 additions & 6 deletions src/core.c/Baggy.pm6
Expand Up @@ -57,19 +57,34 @@ my role Baggy does QuantHash {
# https://github.com/rakudo/rakudo/issues/5057
multi method deepmap(Baggy:D: &mapper) {
my $type := self.WHAT;
my $elems := nqp::clone($!elems);
my $elems := $!elems;
my $clone := nqp::clone($elems);
my $iter := nqp::iterator($elems);

while $iter {
my $pair := nqp::iterval(nqp::shift($iter));
my $value = nqp::getattr($pair,Pair,'$!value');
mapper($value);
my str $key = nqp::iterkey_s(nqp::shift($iter));
my $pair := nqp::iterval($iter);
my $value = nqp::getattr($pair,Pair,'$!value'); # must be Scalar
$value := nqp::decont($value) if nqp::istype($type,Bag);

# update clone
my $returned := nqp::decont(mapper($value).Int);
$returned > 0
?? nqp::bindkey(
$clone,
$key,
nqp::p6bindattrinvres(
nqp::clone($pair),Pair,'$!value',$returned
)
)
!! nqp::deletekey($clone,$key);

$value > 0
?? nqp::bindattr($pair,Pair,'$!value',nqp::decont($value))
!! nqp::deletekey($elems,nqp::iterkey_s($iter))
!! nqp::deletekey($elems,$key)
}

nqp::p6bindattrinvres(nqp::create($type),$type,'$!elems',$elems)
nqp::p6bindattrinvres(nqp::create($type),$type,'$!elems',$clone)
}

#--- object creation methods
Expand Down
27 changes: 21 additions & 6 deletions src/core.c/Mixy.pm6
Expand Up @@ -8,19 +8,34 @@ my role Mixy does Baggy {
# https://github.com/rakudo/rakudo/issues/5057
multi method deepmap(Mixy:D: &mapper) {
my $type := self.WHAT;
my $elems := nqp::clone(nqp::getattr(self,self.WHAT,'$!elems'));
my $elems := nqp::getattr(self,self.WHAT,'$!elems');
my $clone := nqp::clone($elems);
my $iter := nqp::iterator($elems);

while $iter {
my $pair := nqp::iterval(nqp::shift($iter));
my $value = nqp::getattr($pair,Pair,'$!value');
mapper($value);
my str $key = nqp::iterkey_s(nqp::shift($iter));
my $pair := nqp::iterval($iter);
my $value = nqp::getattr($pair,Pair,'$!value'); # must be Scalar
$value := nqp::decont($value) if nqp::istype($type,Mix);

# update clone
my $returned := nqp::decont(mapper($value).Int);
$returned
?? nqp::bindkey(
$clone,
$key,
nqp::p6bindattrinvres(
nqp::clone($pair),Pair,'$!value',$returned
)
)
!! nqp::deletekey($clone,$key);

$value
?? nqp::bindattr($pair,Pair,'$!value',nqp::decont($value))
!! nqp::deletekey($elems,nqp::iterkey_s($iter))
!! nqp::deletekey($elems,$key)
}

nqp::p6bindattrinvres(nqp::create($type),$type,'$!elems',$elems)
nqp::p6bindattrinvres(nqp::create($type),$type,'$!elems',$clone)
}

multi method kxxv(Mixy:D:) {
Expand Down
10 changes: 7 additions & 3 deletions src/core.c/Setty.pm6
Expand Up @@ -50,16 +50,20 @@ my role Setty does QuantHash {
# https://github.com/rakudo/rakudo/issues/5057
multi method deepmap(Setty:D: &mapper) {
my $type := self.WHAT;
my $elems := nqp::clone(nqp::getattr(self,self.WHAT,'$!elems'));
my $elems := $!elems;
my $clone := nqp::clone($elems);
my $iter := nqp::iterator($elems);

while $iter {
nqp::shift($iter);
mapper(my $value = 1);
my $value = 1; # must be Scalar
$value := nqp::decont($value) if nqp::istype($type,Set);

nqp::deletekey($clone,nqp::iterkey_s($iter)) unless mapper($value);
nqp::deletekey($elems,nqp::iterkey_s($iter)) unless $value;
}

nqp::p6bindattrinvres(nqp::create($type),$type,'$!elems',$elems)
nqp::p6bindattrinvres(nqp::create($type),$type,'$!elems',$clone)
}

method default(--> False) { }
Expand Down

0 comments on commit d0ec99a

Please sign in to comment.