use std::marker::PhantomData;
use futures::future::LocalBoxFuture;
use crate::Channel;
pub struct WebWorkerFn<T, R> {
pub(crate) name: &'static str,
#[cfg_attr(not(feature = "iter-ext"), allow(dead_code))]
pub(crate) func: fn(T) -> R,
}
impl<T, R> Clone for WebWorkerFn<T, R> {
fn clone(&self) -> Self {
*self
}
}
impl<T, R> Copy for WebWorkerFn<T, R> {}
impl<T, R> WebWorkerFn<T, R> {
pub fn new_unchecked(func_name: &'static str, f: fn(T) -> R) -> Self {
Self {
name: func_name,
func: f,
}
}
}
pub struct WebWorkerChannelFn<T, R> {
pub(crate) name: &'static str,
#[allow(dead_code)]
pub(crate) func: fn(T, Channel) -> LocalBoxFuture<'static, R>,
pub(crate) _phantom: PhantomData<fn(T) -> R>,
}
impl<T, R> Clone for WebWorkerChannelFn<T, R> {
fn clone(&self) -> Self {
*self
}
}
impl<T, R> Copy for WebWorkerChannelFn<T, R> {}
impl<T, R> WebWorkerChannelFn<T, R> {
pub fn new_unchecked(
func_name: &'static str,
f: fn(T, Channel) -> LocalBoxFuture<'static, R>,
) -> Self {
Self {
name: func_name,
func: f,
_phantom: PhantomData,
}
}
}
#[macro_export]
macro_rules! webworker {
($name:ident) => {{
let _ = $name::__WEBWORKER;
$crate::func::WebWorkerFn::new_unchecked(stringify!($name), $name)
}};
}
#[macro_export]
macro_rules! webworker_channel {
($name:ident) => {{
let _ = $name::__WEBWORKER_CHANNEL;
$crate::func::WebWorkerChannelFn::new_unchecked(stringify!($name), |a, c| {
Box::pin($name(a, c))
})
}};
}