Acme-Selection-RarestFirst
view release on metacpan or search on metacpan
lib/Acme/Selection/RarestFirst.pm view on Meta::CPAN
}
}
method pick ( $my_bitfield, $priorities //= () ) {
my @candidates;
for ( my $i = 0; $i < $size; $i++ ) {
next if $my_bitfield->get($i);
next if defined $priorities && ( $priorities->[$i] // 1 ) <= 0;
push @candidates, $i;
}
return undef unless @candidates;
# Sort by:
# 1. User priority (higher first)
# 2. Availability (lowest first)
# 3. Random tie-break (achieved by shuffling before sort)
@candidates = shuffle @candidates;
@candidates = sort {
my $p_a = $priorities ? ( $priorities->[$a] // 1 ) : 1;
my $p_b = $priorities ? ( $priorities->[$b] // 1 ) : 1;
my $avail_a = $availability[$a] // 0;
( run in 0.986 second using v1.01-cache-2.11-cpan-d80b1682f3f )