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
use crate::prelude::RandomNumberGenerator;
use core::iter::Iterator;
use std::convert::TryInto;

pub struct DiceIterator {
    die_type: i32,
    rng: *mut RandomNumberGenerator,
}

impl DiceIterator {
    pub fn new<T>(die_type: T, rng: &mut RandomNumberGenerator) -> Self
    where
        T: TryInto<i32>,
    {
        let dt = die_type.try_into().ok().unwrap();
        Self { die_type: dt, rng }
    }
}

impl Iterator for DiceIterator {
    type Item = i32;

    fn next(&mut self) -> Option<i32> {
        unsafe { Some(self.rng.as_mut().unwrap().roll_dice(1, self.die_type)) }
    }
}