1use std::sync::Arc;
2
3pub type TaskFn = Box<dyn FnOnce() + Send + 'static>;
4
5pub(crate) struct TaskListeners {
6 pub(crate) before_execute: Box<dyn Fn(usize) + Send + Sync>,
7 pub(crate) after_execute: Box<dyn Fn(usize) + Send + Sync>,
8}
9
10pub struct Task {
11 id: usize,
12 task_fn: TaskFn,
13 listeners: Arc<TaskListeners>,
14}
15
16impl Task {
17 pub(crate) fn create(id: usize, task_fn: TaskFn, listeners: Arc<TaskListeners>) -> Self {
18 Self {
19 id,
20 task_fn,
21 listeners,
22 }
23 }
24
25 pub(crate) fn run(self) {
26 let listeners = self.listeners;
27 (listeners.before_execute)(self.id);
28 (self.task_fn)();
29 (listeners.after_execute)(self.id);
30 }
31}