pub mod decider;
pub mod strategy;

mod spec_builder;
mod sup_actor;
mod sup_child;

use std::pin::Pin;
use std::sync::Arc;

use mm1_core::context::{Fork, InitDone, Linking, Messaging, Now, Quit, Start, Stop, Watching};
pub use sup_actor::{MixedSupError, mixed_sup};

use crate::common::factory::ActorFactory;

pub trait MixedSupContext<Runnable>:
    Fork
    + InitDone
    + Linking
    + Messaging
    + Now<Instant = tokio::time::Instant>
    + Quit
    + Start<Runnable>
    + Stop
    + Watching
{
}
impl<Ctx, Runnable> MixedSupContext<Runnable> for Ctx where
    Ctx: Fork
        + InitDone
        + Linking
        + Messaging
        + Now<Instant = tokio::time::Instant>
        + Quit
        + Start<Runnable>
        + Stop
        + Watching
{
}

pub struct MixedSup<RS, C> {
    restart_strategy: RS,
    children:         C,
}

pub type ErasedActorFactory<R> = Pin<Arc<dyn ActorFactory<Args = (), Runnable = R>>>;

impl<RS> MixedSup<RS, ()> {
    pub fn new(restart_strategy: RS) -> Self {
        Self {
            restart_strategy,
            children: (),
        }
    }
}
