1
1
use permutohedron;
2
- use quickcheck:: quickcheck;
2
+ use quickcheck as qc;
3
+ use rand:: { distributions:: { Distribution , Standard } , Rng , SeedableRng , rngs:: StdRng } ;
3
4
use rand:: { seq:: SliceRandom , thread_rng} ;
4
- use std:: cmp:: min;
5
+ use std:: { cmp:: min, fmt :: Debug , marker :: PhantomData } ;
5
6
use itertools as it;
6
7
use crate :: it:: Itertools ;
7
8
use crate :: it:: ExactlyOneError ;
@@ -357,7 +358,7 @@ fn sorted_by() {
357
358
it:: assert_equal ( v, vec ! [ 4 , 3 , 2 , 1 , 0 ] ) ;
358
359
}
359
360
360
- quickcheck ! {
361
+ qc :: quickcheck! {
361
362
fn k_smallest_range( n: u64 , m: u64 , k: u64 ) -> ( ) {
362
363
// Generate a random permutation of n..n+m
363
364
let i = {
@@ -374,6 +375,38 @@ quickcheck! {
374
375
}
375
376
}
376
377
378
+ #[ derive( Clone , Debug ) ]
379
+ struct RandIter < T : ' static + Clone + Send , R : ' static + Clone + Rng + SeedableRng + Send = StdRng > {
380
+ idx : usize ,
381
+ len : usize ,
382
+ rng : R ,
383
+ _t : PhantomData < T >
384
+ }
385
+
386
+ impl < T : Clone + Send , R : Clone + Rng + SeedableRng + Send > Iterator for RandIter < T , R >
387
+ where Standard : Distribution < T > {
388
+ type Item = T ;
389
+ fn next ( & mut self ) -> Option < T > {
390
+ if self . idx == self . len {
391
+ None
392
+ } else {
393
+ self . idx += 1 ;
394
+ Some ( self . rng . gen ( ) )
395
+ }
396
+ }
397
+ }
398
+
399
+ impl < T : Clone + Send , R : Clone + Rng + SeedableRng + Send > qc:: Arbitrary for RandIter < T , R > {
400
+ fn arbitrary < G : qc:: Gen > ( g : & mut G ) -> Self {
401
+ RandIter {
402
+ idx : 0 ,
403
+ len : g. size ( ) ,
404
+ rng : R :: seed_from_u64 ( g. next_u64 ( ) ) ,
405
+ _t : PhantomData { } ,
406
+ }
407
+ }
408
+ }
409
+
377
410
#[ test]
378
411
fn sorted_by_key ( ) {
379
412
let sc = [ 3 , 4 , 1 , 2 ] . iter ( ) . cloned ( ) . sorted_by_key ( |& x| x) ;
0 commit comments