Skip to content

Commit

Permalink
Reduction spree in Baggy
Browse files Browse the repository at this point in the history
  • Loading branch information
lizmat committed Aug 10, 2018
1 parent 0b3fc07 commit 8e4a01e
Showing 1 changed file with 54 additions and 56 deletions.
110 changes: 54 additions & 56 deletions src/core/Baggy.pm6
Expand Up @@ -20,23 +20,23 @@ my role Baggy does QuantHash {
nqp::unless(
nqp::eqaddr(self,other),
nqp::if( # not same object
(my $araw := $!elems) && nqp::elems($araw),
(my \araw := $!elems) && nqp::elems(araw),
nqp::if( # something on left
(my $braw := other.RAW-HASH) && nqp::elems($braw),
(my \braw := other.RAW-HASH) && nqp::elems(braw),
nqp::if( # something on both sides
nqp::iseq_i(nqp::elems($araw),nqp::elems($braw)),
nqp::iseq_i(nqp::elems(araw),nqp::elems(braw)),
nqp::stmts( # same size
(my $iter := nqp::iterator($araw)),
(my \iter := nqp::iterator(araw)),
nqp::while(
$iter,
iter,
nqp::unless(
nqp::getattr(
nqp::ifnull(
nqp::atkey($braw,nqp::iterkey_s(nqp::shift($iter))),
nqp::atkey(braw,nqp::iterkey_s(nqp::shift(iter))),
BEGIN nqp::p6bindattrinvres( # virtual Pair with 0
nqp::create(Pair),Pair,'$!value',0)
),Pair,'$!value')
== nqp::getattr(nqp::iterval($iter),Pair,'$!value'),
== nqp::getattr(nqp::iterval(iter),Pair,'$!value'),
return False # missing/different: we're done
)
),
Expand All @@ -46,7 +46,7 @@ my role Baggy does QuantHash {
),
# true -> both empty
nqp::isfalse(
($braw := other.RAW-HASH) && nqp::elems($braw)
(my \raw := other.RAW-HASH) && nqp::elems(raw)
)
)
)
Expand Down Expand Up @@ -74,10 +74,10 @@ my role Baggy does QuantHash {
nqp::if(
$!elems && nqp::existskey($!elems,(my $which := k.WHICH)),
nqp::stmts(
(my $value :=
(my \value :=
nqp::getattr(nqp::atkey($!elems,$which),Pair,'$!value')),
nqp::deletekey($!elems,$which),
$value
value
),
0
)
Expand Down Expand Up @@ -124,11 +124,11 @@ my role Baggy does QuantHash {

method new-from-pairs(Baggy:_: *@pairs --> Baggy:D) {
nqp::if(
(my $iterator := @pairs.iterator).is-lazy,
(my \iterator := @pairs.iterator).is-lazy,
Failure.new(X::Cannot::Lazy.new(:action<coerce>,:what(self.^name))),
nqp::create(self).SET-SELF(
Rakudo::QuantHash.ADD-PAIRS-TO-BAG(
nqp::create(Rakudo::Internals::IterationSet),$iterator
nqp::create(Rakudo::Internals::IterationSet),iterator
)
)
)
Expand Down Expand Up @@ -264,31 +264,29 @@ my role Baggy does QuantHash {

method !HASHIFY(\type) {
nqp::stmts(
(my $hash := Hash.^parameterize(type,Any).new),
(my $descriptor := nqp::getattr($hash,Hash,'$!descriptor')),
(my \hash := Hash.^parameterize(type,Any).new),
(my \descriptor := nqp::getattr(hash,Hash,'$!descriptor')),
nqp::if(
$!elems && nqp::elems($!elems),
nqp::stmts(
(my $storage := nqp::clone($!elems)),
(my $iter := nqp::iterator($storage)),
(my \storage := nqp::clone($!elems)),
(my \iter := nqp::iterator(storage)),
nqp::while(
$iter,
iter,
nqp::bindkey(
$storage,
nqp::iterkey_s(nqp::shift($iter)),
storage,
nqp::iterkey_s(nqp::shift(iter)),
nqp::p6bindattrinvres(
nqp::clone(nqp::iterval($iter)),
Pair,
'$!value',
(nqp::p6scalarfromdesc($descriptor) =
nqp::getattr(nqp::iterval($iter),Pair,'$!value'))
nqp::clone(nqp::iterval(iter)),Pair,'$!value',
(nqp::p6scalarfromdesc(descriptor) =
nqp::getattr(nqp::iterval(iter),Pair,'$!value'))
)
)
),
nqp::bindattr($hash,Map,'$!storage',$storage)
nqp::bindattr(hash,Map,'$!storage',storage)
)
),
$hash
hash
)
}
multi method hash(Baggy:D: --> Hash:D) { self!HASHIFY(UInt) }
Expand All @@ -299,9 +297,9 @@ my role Baggy does QuantHash {
multi method Str(Baggy:D: --> Str:D) {
nqp::join(' ',Rakudo::QuantHash.RAW-VALUES-MAP(self, {
nqp::if(
(my $value := nqp::getattr($_,Pair,'$!value')) == 1,
(my \value := nqp::getattr($_,Pair,'$!value')) == 1,
nqp::getattr($_,Pair,'$!key').gist,
"{nqp::getattr($_,Pair,'$!key').gist}($value)"
"{nqp::getattr($_,Pair,'$!key').gist}({value})"
)
}))
}
Expand All @@ -313,9 +311,9 @@ my role Baggy does QuantHash {
Rakudo::Sorting.MERGESORT-str(
Rakudo::QuantHash.RAW-VALUES-MAP(self, {
nqp::if(
(my $value := nqp::getattr($_,Pair,'$!value')) == 1,
(my \value := nqp::getattr($_,Pair,'$!value')) == 1,
nqp::getattr($_,Pair,'$!key').gist,
"{nqp::getattr($_,Pair,'$!key').gist}($value)"
"{nqp::getattr($_,Pair,'$!key').gist}({value})"
)
})
)
Expand Down Expand Up @@ -362,10 +360,10 @@ my role Baggy does QuantHash {
nqp::if(
$!elems && nqp::elems($!elems),
nqp::stmts(
(my $iter := Rakudo::QuantHash.ROLL($!elems)),
(my $pair := nqp::iterval($iter)),
nqp::deletekey($!elems,nqp::iterkey_s($iter)),
$pair
(my \iter := Rakudo::QuantHash.ROLL($!elems)),
(my \pair := nqp::iterval(iter)),
nqp::deletekey($!elems,nqp::iterkey_s(iter)),
pair
),
Nil
)
Expand All @@ -382,12 +380,12 @@ my role Baggy does QuantHash {
nqp::if(
nqp::elems($!picked),
nqp::stmts(
(my $pair := nqp::atkey(
(my \pair := nqp::atkey(
$!elems,
(my $key := nqp::pop_s($!picked))
(my \key := nqp::pop_s($!picked))
)),
nqp::deletekey($!elems,$key),
$pair
nqp::deletekey($!elems,key),
pair
),
IterationEnd
)
Expand Down Expand Up @@ -450,38 +448,38 @@ my role Baggy does QuantHash {
nqp::stmts(
(my Int $rand := $!total.rand.Int),
(my Int $seen := 0),
(my $iter := nqp::iterator($!weights)),
(my \iter := nqp::iterator($!weights)),
nqp::while(
$iter && nqp::isle_I(
iter && nqp::isle_I(
($seen := nqp::add_I(
$seen,
nqp::iterval(nqp::shift($iter)),
nqp::iterval(nqp::shift(iter)),
Int
)),
$rand
),
nqp::null
),
nqp::bindkey( # $iter now contains picked one
nqp::bindkey( # iter now contains picked one
$!weights,
nqp::iterkey_s($iter),
nqp::sub_I(nqp::iterval($iter),1,Int)
nqp::iterkey_s(iter),
nqp::sub_I(nqp::iterval(iter),1,Int)
),
($!total := nqp::sub_I($!total,1,Int)),
nqp::iterkey_s($iter)
nqp::iterkey_s(iter)
)
}

method !SET-SELF(\raw, \todo, \total) {
nqp::stmts(
($!weights := nqp::clone($!raw := raw)),
(my $iter := nqp::iterator($!weights)),
(my \iter := nqp::iterator($!weights)),
nqp::while(
$iter,
iter,
nqp::bindkey(
$!weights,
nqp::iterkey_s(nqp::shift($iter)),
nqp::getattr(nqp::iterval($iter),Pair,'$!value')
nqp::iterkey_s(nqp::shift(iter)),
nqp::getattr(nqp::iterval(iter),Pair,'$!value')
)
),
($!todo := nqp::if(todo > total,total,todo)),
Expand Down Expand Up @@ -681,17 +679,17 @@ my role Baggy does QuantHash {
nqp::if(
raw && nqp::elems(raw),
nqp::stmts(
(my $elems := nqp::clone(raw)),
(my $iter := nqp::iterator($elems)),
(my \elems := nqp::clone(raw)),
(my \iter := nqp::iterator(elems)),
nqp::while(
$iter,
iter,
nqp::bindkey(
$elems,
nqp::iterkey_s(nqp::shift($iter)),
nqp::getattr(nqp::iterval($iter),Pair,'$!key'),
elems,
nqp::iterkey_s(nqp::shift(iter)),
nqp::getattr(nqp::iterval(iter),Pair,'$!key'),
)
),
nqp::create(type).SET-SELF($elems)
nqp::create(type).SET-SELF(elems)
),
nqp::if(
nqp::eqaddr(type,Set),
Expand Down

0 comments on commit 8e4a01e

Please sign in to comment.