ice-threads 0.1.0

Lightweight Thread pool implementation.
Documentation
use crate::IceBox;

use std::{
    thread,
    thread::JoinHandle
};
use std::sync::{
    Arc, Mutex,
    mpsc::Receiver
};


// Heater, used to melt Ice
pub(crate) struct Heater {
    core: Option<JoinHandle<()>>
}

impl Heater {
    // Creates a new Heater that waits for Ice to be sent
    pub fn new(ice_boxes: Arc<Mutex<Receiver<IceBox>>>) -> Heater {
        let core = thread::Builder::new().name("Heater".to_string()).spawn(move || {
            loop {
                let icebox = ice_boxes.lock().unwrap()
                                      .recv().unwrap();

                match icebox {
                    IceBox::Some(ice) => ice.melt(),
                    IceBox::None      => break
                }
            }
        }).expect("ice_threads::Heater::new -> Could not create a new instance");

        Heater {
            core: Some(core)
        }
    }

    // Heater allows it's core to be taken out
    // Used by Melter when shutting down
    pub fn take_core(&mut self) -> Option<JoinHandle<()>> {
        self.core.take()
    }
}