use crate::{NodeKind, scheduler::Task};
use std::{collections::BTreeMap, sync::Arc};
#[derive(Debug)]
pub struct TaskTree {
maps: BTreeMap<String, Arc<Task>>,
root: Option<Arc<Task>>,
}
impl TaskTree {
pub fn new() -> Self {
Self {
maps: BTreeMap::new(),
root: None,
}
}
pub fn tasks(&self) -> Vec<Arc<Task>> {
self.maps.values().cloned().collect()
}
pub fn root(&self) -> Option<Arc<Task>> {
self.root.clone()
}
pub fn task_by_tid(&self, tid: &str) -> Option<Arc<Task>> {
self.maps.get(tid).cloned()
}
pub fn find_tasks(&self, predicate: impl Fn(&Arc<Task>) -> bool) -> Vec<Arc<Task>> {
let mut tasks = Vec::new();
for t in self.maps.values() {
if predicate(t) {
tasks.push(t.clone());
}
}
tasks
}
pub fn push(&mut self, task: Arc<Task>) {
self.maps
.entry(task.id.clone())
.and_modify(|t| {
*t = task.clone();
})
.or_insert(task.clone());
if task.node().kind() == NodeKind::Workflow {
self.root = Some(task);
}
}
}