use std::time::{Duration, Instant, SystemTime};
use tokio::task::JoinHandle;
use super::{BoxFuture, Runtime, SpawnHandle, SpawnHandleInner};
#[derive(Clone, Copy, Default)]
pub struct TokioRuntime;
impl Runtime for TokioRuntime {
fn spawn(&self, fut: BoxFuture<()>) -> SpawnHandle {
let handle: JoinHandle<()> = tokio::spawn(fut);
SpawnHandle::from_inner(TokioSpawnHandle { handle })
}
fn sleep(&self, duration: Duration) -> BoxFuture<()> {
Box::pin(tokio::time::sleep(duration))
}
fn now_monotonic(&self) -> Instant {
Instant::now()
}
fn now_wall_clock(&self) -> SystemTime {
SystemTime::now()
}
}
pub(super) struct TokioSpawnHandle {
handle: JoinHandle<()>,
}
impl SpawnHandleInner for TokioSpawnHandle {
fn abort(&self) {
self.handle.abort();
}
fn is_finished(&self) -> bool {
self.handle.is_finished()
}
}