drumbeat 0.1.1

An event handling system aimed towards real-time applications such as GUIs and Game Engines.
Documentation
use super::observable::{DummyOwner, Owner, Signal};
use super::scheduler::Scheduler;
use crate::sync::threadpool::Task;

use std::sync::{Arc, Weak};

pub struct Subscription {
  subscriber: Weak<dyn Owner>,
  _scheduler: Option<Arc<dyn Scheduler>>,
}

impl Subscription {
  pub(super) fn new(subscriber: Weak<dyn Owner>) -> Self {
    Subscription {
      subscriber: subscriber.clone(),
      _scheduler: subscriber.upgrade().map(|subscriber| subscriber.scheduler()),
    }
  }

  pub fn unsubscribe(&mut self) {
    if let Some(subscriber) = self.subscriber.upgrade() {
      self.subscriber = Weak::<DummyOwner>::new();
      if let Some(owner) = subscriber.owner() {
        owner.handle(Signal::Recycle(subscriber.id()))
      }
    }
  }

  pub fn active(&self) -> bool {
    self.subscriber.upgrade().is_some()
  }

  pub fn finalize<F>(&mut self, task: F) -> Self
  where
    F: Fn() + Send + Sync + 'static,
  {
    match self.subscriber.upgrade() {
      Some(owner) => {
        self.subscriber = Weak::<DummyOwner>::new();
        owner.add_finalize(Task::new(task));
        Subscription::new(Arc::downgrade(&owner))
      }
      None => Subscription::new(Weak::<DummyOwner>::new()),
    }
  }
}

impl Drop for Subscription {
  fn drop(&mut self) {
    self.unsubscribe();
  }
}