#![no_std]
#![allow(warnings)]
extern crate alloc;
use core::result::Result;
use alloc::{boxed::Box,collections::VecDeque, vec::Vec};
use core::ops::{Deref, DerefMut};
pub struct Manager{
list:VecDeque<Slot>
}
impl Deref for Manager{
type Target = VecDeque<Slot>;
fn deref(&self) -> &Self::Target{
&self.list
}
}
impl DerefMut for Manager{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.list
}
}
impl Manager{
pub fn new(cap:usize)->Manager{
return Manager { list: VecDeque::with_capacity(cap) }
}
pub fn add(&mut self,func:Slot)->usize{
let mut n = -1;
for (id,f) in self.list.iter_mut().enumerate(){
if f.used == Status::Used || f.used == Status::Empty{
n = id as i32;
break;
}
}
if n != -1{
self.list[n as usize] = func;
return n as usize
}
else{
self.list.push_back(func);
return (self.list.len()-1) as usize
}
}
pub fn rem(&mut self,id:usize){
self.list[id].closure = Box::new(||{});
self.list[id].used =Status::Empty;
}
pub fn reload(&mut self,id:usize){
self.list[id].used = Status::Pending;
}
pub fn reload_all(&mut self){
for f in self.list.iter_mut(){
f.used = Status::Pending;
}
}
pub fn exec(&mut self,id:usize)->bool{
if self.list[id].used != Status::Busy && self.list[id].used != Status::Empty{
self.list[id].used = Status::Busy;
(self.list[id])();
self.list[id].used = Status::Used;
return true
}
return false
}
pub fn exec_all(&mut self)->Result<(),Vec<usize>>{
let mut errs:Vec<usize> = Vec::new();
for (id,f) in self.list.iter_mut().enumerate(){
if f.used == Status::Busy || f.used == Status::Empty{
errs.push(id);
continue;
}
f.used = Status::Busy;
(f)();
f.used = Status::Used;
}
if errs.len() != 0{
return Err(errs)
}
return Ok(())
}
}
#[derive(PartialEq,Debug)]
pub enum Status{
Pending,
Busy,
Used,
Empty
}
pub struct Slot{
closure : Box<dyn Fn()>,
pub used : Status
}
impl Deref for Slot{
type Target = Box<dyn Fn()>;
fn deref(&self) -> &Self::Target {
&self.closure
}
}
impl Slot{
pub fn new(func:Box<dyn Fn()>)->Slot{
return Slot { closure: func, used: Status::Pending }
}
}