jtp 0.1.1

A simple implementation of thread pool, similar to the ThreadPoolExecutor in java.
Documentation
use std::{panic::UnwindSafe, sync::Arc};

pub type TaskFn = Box<dyn FnOnce() + Send + UnwindSafe + 'static>;

pub(crate) struct TaskListeners {
    pub(crate) before_execute: Box<dyn Fn(usize) + Send + Sync>,
    pub(crate) after_execute: Box<dyn Fn(usize) + Send + Sync>,
}

pub struct Task {
    id: usize,
    task_fn: TaskFn,
    listeners: Arc<TaskListeners>,
}

impl Task {
    pub(crate) fn create(id: usize, task_fn: TaskFn, listeners: Arc<TaskListeners>) -> Self {
        Self {
            id,
            task_fn,
            listeners,
        }
    }

    pub(crate) fn run(self) {
        let listeners = self.listeners;
        (listeners.before_execute)(self.id);
        (self.task_fn)();
        (listeners.after_execute)(self.id);
    }
}