hobo 0.3.0

hobo is a Rust frontend framework
Documentation
use discard::DiscardOnDrop;
use futures_signals::{
	signal::{Signal, SignalExt},
	signal_map::{MapDiff, SignalMap, SignalMapExt},
	signal_vec::{SignalVec, SignalVecExt, VecDiff},
	CancelableFutureHandle,
};
use wasm_bindgen_futures::spawn_local as spawn;

pub trait SignalExt2: Signal {
	fn subscribe<F>(self, callback: F) -> DiscardOnDrop<CancelableFutureHandle> where
		F: FnMut(Self::Item) + 'static,
		Self: Sized;
}

impl<T: Signal + 'static> SignalExt2 for T {
	fn subscribe<F>(self, mut callback: F) -> DiscardOnDrop<CancelableFutureHandle> where
		F: FnMut(Self::Item) + 'static,
		Self: Sized,
	{
		let (handle, fut) = futures_signals::cancelable_future(self.for_each(move |x| { callback(x); async move {} }), || {});
		spawn(fut);
		handle
	}
}

pub trait SignalMapExt2: SignalMap {
	fn subscribe<F>(self, callback: F) -> DiscardOnDrop<CancelableFutureHandle> where
		F: FnMut(MapDiff<Self::Key, Self::Value>) + 'static,
		Self: Sized;
}

impl<T: SignalMap + 'static> SignalMapExt2 for T {
	fn subscribe<F>(self, mut callback: F) -> DiscardOnDrop<CancelableFutureHandle> where
		F: FnMut(MapDiff<Self::Key, Self::Value>) + 'static,
		Self: Sized,
	{
		let (handle, fut) = futures_signals::cancelable_future(self.for_each(move |x| { callback(x); async move {} }), || {});
		spawn(fut);
		handle
	}
}

pub trait SignalVecExt2: SignalVec {
	fn subscribe<F>(self, callback: F) -> DiscardOnDrop<CancelableFutureHandle> where
		F: FnMut(VecDiff<Self::Item>) + 'static,
		Self: Sized;
}

impl<T: SignalVec + 'static> SignalVecExt2 for T {
	fn subscribe<F>(self, mut callback: F) -> DiscardOnDrop<CancelableFutureHandle> where
		F: FnMut(VecDiff<Self::Item>) + 'static,
		Self: Sized,
	{
		let (handle, fut) = futures_signals::cancelable_future(self.for_each(move |x| { callback(x); async move {} }), || {});
		spawn(fut);
		handle
	}
}