use core::{future::Future, pin::Pin}; use core::sync::atomic::{AtomicU64, Ordering}; use core::task::{Context, Poll}; use alloc::boxed::Box; pub mod executor; pub mod keyboard; pub mod simple_executor; #[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) } }