pub mod generators;
pub trait Generator
where
Self: 'static,
{
type Output;
fn generate(&mut self) -> Self::Output;
}
pub trait Generatable {
type Generator: Generator<Output = Self>;
fn generator() -> Self::Generator;
}
pub struct GeneratorIterator<T> {
gen: T,
}
impl<T> GeneratorIterator<T> {
pub fn new(generator: T) -> Self {
Self { gen: generator }
}
pub fn into_inner(self) -> T {
self.gen
}
}
impl<T, U> Iterator for GeneratorIterator<T>
where
T: Generator<Output = U> + 'static,
{
type Item = U;
fn next(&mut self) -> Option<Self::Item> {
Some(self.gen.generate())
}
}
pub struct GeneratorMutIterator<'a, T> {
gen: &'a mut T,
}
impl<'a, T> GeneratorMutIterator<'a, T> {
pub fn new(generator: &'a mut T) -> Self {
Self { gen: generator }
}
}
impl<'a, T, U> Iterator for GeneratorMutIterator<'a, T>
where
T: Generator<Output = U>,
{
type Item = U;
fn next(&mut self) -> Option<Self::Item> {
Some(self.gen.generate())
}
}
pub use boulder_derive::Generatable;
#[doc(hidden)]
pub mod guts {
use super::Generatable;
pub use super::Generator as MiniGenerator;
use std::cell::{Cell, RefCell};
use std::rc::Rc;
use std::sync::{Arc, Mutex};
pub trait MiniGeneratable<T>: Sized {
type Generator: MiniGenerator<Output = Self>;
fn mini_generator() -> Self::Generator;
}
impl<T> Generatable for T
where
T: BoulderBase,
T: MiniGeneratable<<T as BoulderBase>::Base>,
{
type Generator = <T as MiniGeneratable<<T as BoulderBase>::Base>>::Generator;
fn generator() -> Self::Generator {
<T as MiniGeneratable<<T as BoulderBase>::Base>>::mini_generator()
}
}
pub trait BoulderBase {
type Base;
}
impl<T> BoulderBase for Option<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Arc<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Rc<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for RefCell<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Cell<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
impl<T> BoulderBase for Mutex<T>
where
T: BoulderBase,
{
type Base = <T as BoulderBase>::Base;
}
}