use super::super::rand::{NumPrimitive, R};
use super::base::Generator;
use core::marker::PhantomData;
#[derive(Copy)]
pub struct Num<T>(PhantomData<T>);
impl<T> Clone for Num<T> {
fn clone(&self) -> Self {
Num(self.0)
}
}
impl<T: NumPrimitive> Default for Num<T> {
fn default() -> Self {
Num(PhantomData)
}
}
impl<T: NumPrimitive> Generator for Num<T> {
type Item = T;
fn generate(&self, r: &mut R) -> T {
r.num()
}
}
#[derive(Clone)]
pub struct NumRange<T>(std::ops::Range<T>);
impl<T> NumRange<T> {
pub fn new(range: std::ops::Range<T>) -> Self {
NumRange(range)
}
}
impl<T: NumPrimitive> Generator for NumRange<T> {
type Item = T;
fn generate(&self, r: &mut R) -> T {
r.num_range(self.0.start, self.0.end)
}
}
pub fn num<T: NumPrimitive>() -> Num<T> {
Num::<T>::default()
}
pub fn range<T: NumPrimitive>(range: std::ops::Range<T>) -> NumRange<T> {
NumRange::new(range)
}