use std::sync::Arc;
pub trait HandlerFactory<H>: Send + Sync {
fn create(&self) -> H;
}
impl<H, F> HandlerFactory<H> for F
where
F: Fn() -> H + Send + Sync,
{
fn create(&self) -> H {
self()
}
}
pub type BoxedHandlerFactory<H> = Arc<dyn HandlerFactory<H> + Send + Sync>;
pub type HandlerHOF<F> = Arc<dyn Fn() -> F + Send + Sync>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn closure_as_factory() {
let factory = || 42i32;
let result: i32 = factory.create();
assert_eq!(result, 42);
}
#[test]
fn factory_with_captured_deps() {
let counter = Arc::new(std::sync::atomic::AtomicU32::new(0));
let factory = {
let counter = counter.clone();
move || {
counter.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
counter.load(std::sync::atomic::Ordering::SeqCst)
}
};
assert_eq!(factory.create(), 1);
assert_eq!(factory.create(), 2);
assert_eq!(factory.create(), 3);
}
#[test]
fn boxed_factory() {
let factory: BoxedHandlerFactory<i32> = Arc::new(|| 99);
assert_eq!(factory.create(), 99);
}
}