mod executor; pub use executor::Executor; use crate::{subscription, Command, Subscription}; use futures::Sink; use std::marker::PhantomData; #[derive(Debug)] pub struct Runtime { executor: Executor, subscriptions: subscription::Tracker, receiver: Receiver, _message: PhantomData, } impl Runtime where Hasher: std::hash::Hasher + Default, Event: Send + Clone + 'static, Executor: self::Executor, Receiver: Sink + Unpin + Send + Clone + 'static, Message: Send + 'static, { pub fn new(receiver: Receiver) -> Self { Self { executor: Executor::new(), subscriptions: subscription::Tracker::new(), receiver, _message: PhantomData, } } pub fn spawn(&mut self, command: Command) { use futures::{FutureExt, SinkExt}; let futures = command.futures(); for future in futures { let mut receiver = self.receiver.clone(); self.executor.spawn(future.then(|message| { async move { let _ = receiver.send(message).await; () } })); } } pub fn track( &mut self, subscription: Subscription, ) { let futures = self .subscriptions .update(subscription, self.receiver.clone()); for future in futures { self.executor.spawn(future); } } pub fn broadcast(&mut self, event: Event) { self.subscriptions.broadcast(event); } }