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
47
48
49
50
51
52
/// Creates a [`Raw`] struct by first allocating a `Vec` and passing it to `Raw::new`.
/// 
/// If you need to pass an iterator, use `Raw::new` method.
/// 
/// [`Raw`]: distributions/struct.Raw.html
/// 
/// # Examples
/// 
/// With help of the `raw_dist` macro, we construct a random variable that samples always a fixed value.
/// ```
/// # use markovian::prelude::*;
/// # use rand::prelude::*;
/// # #[macro_use] extern crate markovian;
/// # fn main() {
/// let value = 0;
/// let dis: Raw<_> = raw_dist![(1.0, value)];
///
/// assert_eq!(value, dis.sample(&mut thread_rng()));
/// }
/// ```
#[macro_export]
macro_rules! raw_dist {
    ( $( $x:expr ),* ) => {
        {
            let mut temp_vec = Vec::new();
            $(
                temp_vec.push($x);
            )*
            $crate::distributions::Raw::new(temp_vec)
        }
    };
}


#[cfg(test)]
mod tests {
	// use super::*;
	use crate::distributions::Raw;

	#[test]
	fn construction() {
		let expected = Raw::new(vec![(1.0, 1)]);
		let dis = raw_dist![(1.0, 1)];

		assert_eq!(expected, dis);

		let expected = Raw::new(vec![(0.5, 1), (0.5, 2)]);
		let dis = raw_dist![(0.5, 1), (0.5, 2)];

		assert_eq!(expected, dis);
	}
}