use alloc::boxed::Box; use core::future::Future; use core::pin::Pin; use core::sync::atomic::{AtomicU64, Ordering}; use core::task::{Context, Poll}; pub mod executor; pub mod keyboard; pub mod spawner; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] struct TaskId(u64); impl TaskId { fn new() -> Self { static NEXT_ID: AtomicU64 = AtomicU64::new(0); TaskId(NEXT_ID.fetch_add(1, Ordering::Relaxed)) } } pub struct Task { id: TaskId, future: Pin>>, } impl Task { pub fn new(future: impl Future + 'static) -> Task { Task { id: TaskId::new(), future: Box::pin(future), } } fn poll(&mut self, context: &mut Context) -> Poll<()> { self.future.as_mut().poll(context) } }