use std::borrow::BorrowMut;
use std::collections::{HashMap, VecDeque};
use std::fs::File;
use std::io::{Error, Write};
use std::sync::{Arc, RwLock};
use indicatif::{MultiProgress, ProgressDrawTarget};
use crate::graph::DependencyGraph;
#[derive(Clone)]
pub enum Status {
Idle, Busy(Option<Vec<String>>) }
pub type Task = fn(u64, u64) -> Result<(), String>;
#[derive(Clone)]
pub struct Pool {
tasks: Arc<RwLock<HashMap<String, Task>>>,
graph: Arc<RwLock<DependencyGraph>>,
queue: Arc<RwLock<VecDeque<Task>>>,
progress: Arc<MultiProgress>,
status: Status,
}
impl Pool {
pub fn new() -> Self {
Self {
tasks: Default::default(),
queue: Arc::new(RwLock::new(VecDeque::new())),
progress: Arc::new(MultiProgress::with_draw_target(
ProgressDrawTarget::stderr_with_hz(60),
)),
graph: Arc::new(RwLock::new(DependencyGraph::new())),
status: Status::Idle,
}
}
pub fn add_task(&mut self, name: &str, task: Task, deps: Vec<&str>) {
self.tasks.write().unwrap().insert(name.to_string(), task);
for d in deps {
self.graph.write().unwrap().push( name, d);
}
}
pub fn start_single(&mut self, name: &str) {
self.start_multi(vec![name])
}
pub fn start_multi(&mut self, names: Vec<&str>) {
self.status = Status::Busy(Some(names.iter().map(|s| s.to_string()).collect()));
}
pub fn start(&mut self) {
self.status = Status::Busy(None);
while let Some(name) = self.graph.write().unwrap().pop() {
println!("{}", name);
}
}
}