use super::{
AttachableSubject,
DetachableSubject,
Observer,
Subject,
};
use std::{
borrow::BorrowMut,
cell::RefCell,
};
pub struct VecSubject<O>
where
O: Observer,
{
listeners: RefCell<Vec<O>>,
}
impl<O> VecSubject<O>
where
O: Observer,
{
#[must_use]
pub fn new(listeners: RefCell<Vec<O>>) -> VecSubject<O>
{
VecSubject { listeners }
}
}
impl<O> AttachableSubject<O> for VecSubject<O>
where
O: Observer,
{
fn attach(
&mut self,
attach_observer: O,
)
{
self.listeners.borrow_mut().push(attach_observer);
}
}
#[derive(Debug)]
pub enum DetachError
{
ObserverNotFound,
}
impl<O> DetachableSubject<O, DetachError> for VecSubject<O>
where
O: Observer + Eq,
{
fn detach(
&mut self,
detach_observer: &O,
) -> Result<(), DetachError>
{
let (i, _) = self
.listeners
.borrow()
.iter()
.enumerate()
.find(|(_, o)| o.eq(&detach_observer))
.ok_or(DetachError::ObserverNotFound)?;
self.listeners.borrow_mut().swap_remove(i);
Ok(())
}
}
impl<O> Default for VecSubject<O>
where
O: Observer,
{
fn default() -> Self
{
Self::new(RefCell::default())
}
}
impl<O> Subject for VecSubject<O>
where
O: Observer,
{
fn notify(&self)
{
self.listeners.borrow().iter().for_each(Observer::notify);
}
}