use std::{marker::PhantomData, sync::Arc};
use crate::{
bounded_input::BoundedInput,
cell::{Cell, CellImmutable},
pipeline::{Definite, MaterializeDefinite, Pipeline, PipelineInstall, PipelineSeed},
signal::Signal,
subscription::SubscriptionGuard,
traits::{CellValue, Gettable, Watchable},
};
impl<T: CellValue, M: Send + Sync + 'static> PipelineInstall<T> for Cell<T, M> {
fn install(&self, callback: Arc<dyn Fn(&Signal<T>) + Send + Sync>) -> SubscriptionGuard {
self.subscribe(move |signal| callback(signal))
}
}
impl<T: CellValue> PipelineInstall<T> for BoundedInput<T> {
fn install(&self, callback: Arc<dyn Fn(&Signal<T>) + Send + Sync>) -> SubscriptionGuard {
self.subscribe(move |signal| callback(signal))
}
}
impl<T: CellValue, M: Send + Sync + 'static> PipelineSeed<T> for Cell<T, M> {
fn seed(&self) -> T {
self.get()
}
}
impl<T: CellValue> PipelineSeed<T> for BoundedInput<T> {
fn seed(&self) -> T {
self.get()
}
}
#[allow(private_bounds)]
impl<T: CellValue, M: Send + Sync + 'static> Pipeline<T, Definite> for Cell<T, M> {}
impl<T: CellValue, M: Send + Sync + 'static> MaterializeDefinite<T> for Cell<T, M> {
fn materialize(self) -> Cell<T, CellImmutable> {
Cell {
inner: self.inner,
_marker: PhantomData,
}
}
}
#[allow(private_bounds)]
impl<T: CellValue> Pipeline<T, Definite> for BoundedInput<T> {}
impl<T: CellValue> MaterializeDefinite<T> for BoundedInput<T> {
}