use std::future::Future;
use futures_signals::signal_vec::VecDiff;
pub trait SignalSpawn<A> {
#[cfg(not(target_os = "unknown"))]
fn spawn<F>(self, f: F)
where
Self: Send,
F: Fn(A) + Send + 'static;
#[cfg(not(target_os = "unknown"))]
fn spawn_fut<F, W>(self, f: F)
where
Self: Send,
F: Fn(A) -> W + Send + 'static,
W: Future<Output = ()> + Send + 'static;
#[cfg(all(target_arch = "wasm32"))]
fn spawn<F>(self, f: F)
where
F: Fn(A) + 'static;
#[cfg(all(target_arch = "wasm32"))]
fn spawn_fut<F, W>(self, f: F)
where
F: Fn(A) -> W + 'static,
W: Future<Output = ()> + 'static;
}
pub trait SignalVecSpawn<A> {
#[cfg(not(target_os = "unknown"))]
fn spawn<F>(self, f: F)
where
Self: Send,
F: Fn(VecDiff<A>) + Send + 'static;
#[cfg(all(target_arch = "wasm32"))]
fn spawn<F>(self, f: F)
where
F: Fn(VecDiff<A>) + 'static;
}
#[cfg(not(target_os = "unknown"))]
mod os {
use std::future::{ready, Future};
use futures_signals::{
signal::{Signal, SignalExt},
signal_vec::{SignalVec, SignalVecExt, VecDiff},
};
use crate::{SignalSpawn, SignalVecSpawn};
impl<A, S> SignalSpawn<A> for S
where
S: Signal<Item = A> + 'static,
{
fn spawn<F>(self, f: F)
where
Self: Send,
F: Fn(A) + Send + 'static,
{
self.spawn_fut(move |new| {
f(new);
ready(())
});
}
fn spawn_fut<F, W>(self, f: F)
where
Self: Send,
F: Fn(A) -> W + Send + 'static,
W: Future<Output = ()> + Send + 'static,
{
artwrap::spawn(self.for_each(move |new| f(new)));
}
}
impl<A, S> SignalVecSpawn<A> for S
where
S: SignalVec<Item = A> + 'static,
{
fn spawn<F>(self, f: F)
where
Self: Send,
F: Fn(VecDiff<A>) + Send + 'static,
{
artwrap::spawn(self.for_each(move |new| {
f(new);
ready(())
}));
}
}
}
#[cfg(all(target_arch = "wasm32"))]
mod wasm {
use std::future::{ready, Future};
use futures_signals::{
signal::{Signal, SignalExt},
signal_vec::{SignalVec, SignalVecExt, VecDiff},
};
use crate::{SignalSpawn, SignalVecSpawn};
impl<A, S> SignalSpawn<A> for S
where
S: Signal<Item = A> + 'static,
{
fn spawn<F>(self, f: F)
where
F: Fn(A) + 'static,
{
self.spawn_fut(move |new| {
f(new);
ready(())
});
}
fn spawn_fut<F, W>(self, f: F)
where
F: Fn(A) -> W + 'static,
W: Future<Output = ()> + 'static,
{
artwrap::spawn(self.for_each(move |new| f(new)));
}
}
impl<A, S> SignalVecSpawn<A> for S
where
S: SignalVec<Item = A> + 'static,
{
fn spawn<F>(self, f: F)
where
F: Fn(VecDiff<A>) + 'static,
{
artwrap::spawn(self.for_each(move |new| {
f(new);
ready(())
}));
}
}
}