1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//! # Rand
//!
//! `rand` is the module providing the trait used to implement random generation.

use base::Result;
use base::Datable;

/// Trait implemented by types that can be generated randomly.
pub trait Random
    where   Self: Datable
{
    /// Generates a random value.
    fn generate_cb<P: Datable>(&self, params: &P, cb: &Fn(&Self, &P) -> Result<Self>) -> Result<Self> {
        cb(self, params)
    }

    /// Generates a random value between a range (`from` is included, `to` is excluded).
    fn range_cb<P: Datable>(&self,
                            params: &P,
                            from: &Self,
                            to: &Self,
                            cb: &Fn(&Self, &P, &Self, &Self) -> Result<Self>)
        -> Result<Self>
    {
        cb(self, params, from, to)
    }

    /// Samples a vector of random values picked between a range (`from` is included, `to` is excluded).
    fn sample_cb<P: Datable>(&self,
                             params: &P,
                             from: &Self,
                             to: &Self,
                             cb: &Fn(&Self, &P, &Self, &Self) -> Result<Vec<Self>>)
        -> Result<Vec<Self>>
    {
        cb(self, params, from, to)
    }
}

impl<T> Random for Vec<T>
    where   T: Random
{}

impl<T> Random for Option<T>
    where   T: Random
{}