use crate::*;
use futures::Future;
use std::sync::Arc;
pub fn spawn<M, E, Fun, Fut>(
config: Config,
fun: Fun,
) -> (Child<E, Channel<M>>, Address<Channel<M>>)
where
Fun: FnOnce(Inbox<M>) -> Fut + Send + 'static,
Fut: Future<Output = E> + Send + 'static,
E: Send + 'static,
M: Send + 'static,
{
let channel = Arc::new(Channel::<M>::new(1, 1, config.capacity));
let address = Address::from_channel(channel.clone());
let inbox = Inbox::from_channel(channel.clone());
let handle = tokio::task::spawn(async move { fun(inbox).await });
let child = Child::new(channel, handle, config.link);
(child, address)
}
pub fn spawn_one<M, E, Fun, Fut>(
config: Config,
fun: Fun,
) -> (ChildPool<E, Channel<M>>, Address<Channel<M>>)
where
Fun: FnOnce(Inbox<M>) -> Fut + Send + 'static,
Fut: Future<Output = E> + Send + 'static,
E: Send + 'static,
M: Send + 'static,
{
let channel = Arc::new(Channel::<M>::new(1, 1, config.capacity));
let address = Address::from_channel(channel.clone());
let inbox = Inbox::from_channel(channel.clone());
let handle = tokio::task::spawn(async move { fun(inbox).await });
let child = ChildPool::new(channel, vec![handle], config.link);
(child, address)
}
pub fn spawn_many<M, E, I, Fun, Fut>(
iter: impl IntoIterator<Item = I>,
config: Config,
fun: Fun,
) -> (ChildPool<E, Channel<M>>, Address<Channel<M>>)
where
Fun: FnOnce(I, Inbox<M>) -> Fut + Send + 'static + Clone,
Fut: Future<Output = E> + Send + 'static,
E: Send + 'static,
M: Send + 'static,
I: Send + 'static,
{
let iter = iter.into_iter();
let channel = Arc::new(Channel::<M>::new(1, 1, config.capacity));
let address = Address::from_channel(channel.clone());
let handles = iter
.map(|i| {
let fun = fun.clone();
let inbox = Inbox::from_channel(address.channel().clone());
tokio::task::spawn(async move { fun(i, inbox).await })
})
.collect::<Vec<_>>();
address.channel().set_inbox_count(handles.len());
let child = ChildPool::new(channel, handles, config.link);
(child, address)
}