use super::{Builder, FullBuilder};
use crate::bee::{CloneQueen, DefaultQueen, Queen, QueenCell, QueenMut, Worker};
use crate::hive::TaskQueues;
pub trait TaskQueuesBuilder: Builder + Clone + Default + Sized {
type TaskQueues<W: Worker>: TaskQueues<W>;
fn empty() -> Self;
fn with_queen<Q: Queen>(self, queen: Q) -> FullBuilder<Q, Self::TaskQueues<Q::Kind>>;
fn with_queen_default<Q>(self) -> FullBuilder<Q, Self::TaskQueues<Q::Kind>>
where
Q: Queen + Default,
{
self.with_queen(Q::default())
}
fn with_queen_mut_default<Q>(self) -> FullBuilder<QueenCell<Q>, Self::TaskQueues<Q::Kind>>
where
Q: QueenMut + Default,
{
self.with_queen(QueenCell::new(Q::default()))
}
fn with_worker<W>(self, worker: W) -> FullBuilder<CloneQueen<W>, Self::TaskQueues<W>>
where
W: Worker + Send + Sync + Clone,
{
self.with_queen(CloneQueen::new(worker))
}
fn with_worker_default<W>(self) -> FullBuilder<DefaultQueen<W>, Self::TaskQueues<W>>
where
W: Worker + Send + Sync + Default,
{
self.with_queen(DefaultQueen::default())
}
}
pub mod channel {
use super::*;
use crate::hive::builder::{BuilderConfig, Token};
use crate::hive::{ChannelTaskQueues, Config};
#[derive(Clone, Default, Debug)]
pub struct ChannelBuilder(Config);
impl BuilderConfig for ChannelBuilder {
fn config_ref(&mut self, _: Token) -> &mut Config {
&mut self.0
}
}
impl TaskQueuesBuilder for ChannelBuilder {
type TaskQueues<W: Worker> = ChannelTaskQueues<W>;
fn empty() -> Self {
Self(Config::empty())
}
fn with_queen<Q: Queen>(self, queen: Q) -> FullBuilder<Q, Self::TaskQueues<Q::Kind>> {
FullBuilder::from_config_and_queen(self.0, queen)
}
}
impl From<Config> for ChannelBuilder {
fn from(value: Config) -> Self {
Self(value)
}
}
}
pub mod workstealing {
use super::*;
use crate::hive::builder::{BuilderConfig, Token};
use crate::hive::{Config, WorkstealingTaskQueues};
#[derive(Clone, Default, Debug)]
pub struct WorkstealingBuilder(Config);
impl BuilderConfig for WorkstealingBuilder {
fn config_ref(&mut self, _: Token) -> &mut Config {
&mut self.0
}
}
impl TaskQueuesBuilder for WorkstealingBuilder {
type TaskQueues<W: Worker> = WorkstealingTaskQueues<W>;
fn empty() -> Self {
Self(Config::empty())
}
fn with_queen<Q: Queen>(self, queen: Q) -> FullBuilder<Q, Self::TaskQueues<Q::Kind>> {
FullBuilder::from_config_and_queen(self.0, queen)
}
}
impl From<Config> for WorkstealingBuilder {
fn from(value: Config) -> Self {
Self(value)
}
}
}