use bevy_ecs::prelude::{Entity, World};
use std::sync::Arc;
use crate::{InnerChannel, OperationRoster, ReportUnhandled, StreamEffect, StreamRequest};
pub struct StreamChannel<S> {
target: Option<Entity>,
inner: Arc<InnerChannel>,
_ignore: std::marker::PhantomData<fn(S)>,
}
impl<S: StreamEffect> StreamChannel<S> {
pub fn send(&self, data: S::Input) {
let source = self.inner.source;
let session = self.inner.session;
let target = self.target;
self.inner
.sender
.send(Box::new(
move |world: &mut World, roster: &mut OperationRoster| {
let mut request = StreamRequest {
source,
session,
target,
world,
roster,
};
S::side_effect(data, &mut request)
.and_then(|output| request.send_output(output))
.report_unhandled(source, world);
},
))
.ok();
}
pub(crate) fn new(target: Option<Entity>, inner: Arc<InnerChannel>) -> Self {
Self {
target,
inner,
_ignore: Default::default(),
}
}
}
impl<S> Clone for StreamChannel<S> {
fn clone(&self) -> Self {
Self {
target: ::std::clone::Clone::clone(&self.target),
inner: Arc::clone(&self.inner),
_ignore: Default::default(),
}
}
}