@@ -2317,28 +2317,25 @@ fn max_loop(list, compare, max) {
2317
2317
pub fn sample ( from list : List ( a) , up_to n : Int ) -> List ( a) {
2318
2318
let # ( reservoir , rest ) = build_reservoir ( from : list , sized : n )
2319
2319
2320
- case rest {
2321
- // If we've already taken all the items there were in the list there's no
2322
- // need to do anything else, we return the entire reservoire.
2323
- [ ] -> dict . values ( reservoir )
2324
- _ ->
2325
- case dict . is_empty ( reservoir ) {
2326
- // If the reservoire is empty that means we were asking to sample 0 or
2327
- // less items. That doesn't make much sense, so we just return an empty
2328
- // list.
2329
- True -> [ ]
2330
- False -> {
2331
- let w = float . exponential ( log_random ( ) /. int . to_float ( n ) )
2332
- dict . values ( sample_loop ( list , reservoir , n , w ) )
2333
- }
2334
- }
2320
+ case dict . is_empty ( reservoir ) {
2321
+ // If the reservoire is empty that means we were asking to sample 0 or
2322
+ // less items. That doesn't make much sense, so we just return an empty
2323
+ // list.
2324
+ True -> [ ]
2325
+
2326
+ // Otherwise we keep looping over the remaining part of the list replacing
2327
+ // random elements in the reservoir.
2328
+ False -> {
2329
+ let w = float . exponential ( log_random ( ) /. int . to_float ( n ) )
2330
+ dict . values ( sample_loop ( rest , reservoir , n , w ) )
2331
+ }
2335
2332
}
2336
2333
}
2337
2334
2338
2335
fn sample_loop (
2339
2336
list : List ( a) ,
2340
2337
reservoir : Dict ( Int , a) ,
2341
- k : Int ,
2338
+ n : Int ,
2342
2339
w : Float ,
2343
2340
) -> Dict ( Int , a) {
2344
2341
let skip = {
@@ -2349,9 +2346,9 @@ fn sample_loop(
2349
2346
case drop ( list , skip ) {
2350
2347
[ ] -> reservoir
2351
2348
[ first , .. rest ] -> {
2352
- let reservoir = dict . insert ( reservoir , int . random ( k ) , first )
2353
- let w = w *. float . exponential ( log_random ( ) /. int . to_float ( k ) )
2354
- sample_loop ( rest , reservoir , k , w )
2349
+ let reservoir = dict . insert ( reservoir , int . random ( n ) , first )
2350
+ let w = w *. float . exponential ( log_random ( ) /. int . to_float ( n ) )
2351
+ sample_loop ( rest , reservoir , n , w )
2355
2352
}
2356
2353
}
2357
2354
}
0 commit comments