use std::future::Future;
use std::time::Duration;

pub(crate) trait Backend {
    fn spawn<T: Send + 'static>(
        fut: impl Future<Output = T> + Send + 'static,
    ) -> crate::JoinHandle<T>;
    fn sleep(dur: Duration) -> impl Future<Output = ()> + Send;
}

#[cfg(feature = "rt-tokio")]
mod tokio_backend;
#[cfg(feature = "rt-tokio")]
pub(crate) type Active = tokio_backend::TokioBackend;

#[cfg(feature = "rt-async-std")]
mod async_std_backend;
#[cfg(feature = "rt-async-std")]
pub(crate) type Active = async_std_backend::AsyncStdBackend;

#[cfg(feature = "rt-smol")]
mod smol_backend;
#[cfg(feature = "rt-smol")]
pub(crate) type Active = smol_backend::SmolBackend;
