Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Simplify Bag.grab|pick|roll, they're really just the same
  • Loading branch information
lizmat committed Oct 6, 2013
1 parent c6d5c94 commit 889892a
Showing 1 changed file with 20 additions and 32 deletions.
52 changes: 20 additions & 32 deletions src/core/Baggy.pm
Expand Up @@ -74,50 +74,38 @@ my role Baggy does QuantHash {
method list() { self.keys }
method pairs() { %!elems.values }

method grab ($count = 1) { self.pick($count, :BIND) }

method pick ($count = 1, :$BIND) {
return self.roll if $count ~~ Num && $count == 1 && !$BIND;
method grab ($count = 1) {
ROLLPICKGRAB(self, $count, %!elems.values);
}
method pick ($count = 1) {
ROLLPICKGRAB(self, $count, %!elems.values.map: { (.key => .value) });
}
method roll ($count = 1) {
ROLLPICKGRAB(self, $count, %!elems.values, :keep);
}

my $total = self.total;
my $picks = $total min $count;
my @pairs := $BIND
?? %!elems.values
!! %!elems.values.map( { $_.key => $_.value } );
sub ROLLPICKGRAB ($self, $count, @pairs is rw, :$keep) is hidden_from_backtrace {
my $total = $self.total;
my $todo = $count ~~ Num
?? $total min $count
!! ($count ~~ Whatever ?? $total !! $count);

map {
my $rand = $total.rand.Int;
my $seen = 0;
my $pick;
my $selected;
for @pairs -> $pair {
next if ( $seen += $pair.value ) <= $rand;

$pick = $pair.key;
$selected = $pair.key;
last if $keep;

$pair.value--;
$total--;
last;
}
$pick;
}, 1 .. $picks;
}

method roll ($count = 1) {
my $total = self.total;
my $rolls = $count ~~ Num ?? $total min $count !! $count;
my @pairs := %!elems.values;

map {
my $rand = $total.rand.Int;
my $seen = 0;
my $roll;
for @pairs -> $pair {
next if ( $seen += $pair.value ) <= $rand;

$roll = $pair.key;
last;
}
$roll;
}, 1 .. $rolls;
$selected;
}, 1 .. $todo;
}

proto method classify-list(|) { * }
Expand Down

0 comments on commit 889892a

Please sign in to comment.