use crate::Decorator;
pub struct Builder<T> {
value: T,
}
impl<T> Builder<T> {
pub fn new(initial: T) -> Self {
Builder { value: initial }
}
pub fn step<O>(self, mut decorator: impl Decorator<T, O>) -> Step<O> {
Step {
cur: decorator.produce(self.value),
}
}
}
#[must_use = "Steps do nothing unless you continue the chain or call .build()"]
pub struct Step<T> {
pub(crate) cur: T,
}
impl<T> Step<T> {
pub fn step<O>(self, mut decorator: impl Decorator<T, O>) -> Step<O> {
Step {
cur: decorator.produce(self.cur),
}
}
pub fn build(self) -> T {
self.cur
}
}