use std::marker::PhantomData;
use std::rc::{Rc, Weak};
use std::ops::Fn;
use crate::collections::List;
use crate::rc::WeakByPtr;
use std::vec::Vec;
use delegate::delegate;
use super::base_list_event::{BaseListEvent, LEPubEvent};
use crate::rc::RcByPtr;
pub type SenderArgEventFunc<S, A> = dyn Fn(&S, &A) -> bool;
pub struct ListArgsEvent<S, A>
{
ble: BaseListEvent<SenderArgEventFunc<S, A>, S>,
phantom: PhantomData<A>
}
impl<S, A> ListArgsEvent<S, A>
{
pub fn new() -> Self
{
Self
{
ble: BaseListEvent::new(),
phantom: PhantomData::default()
}
}
pub fn with_capacity(capacity: usize) -> Self
{
Self
{
ble: BaseListEvent::with_capacity(capacity),
phantom: PhantomData::default()
}
}
delegate! {
to self.ble {
fn subscribe(&mut self, f: &Rc<SenderArgEventFunc<S, A>>) -> bool;
fn unsubscribe(&mut self, f: &Rc<SenderArgEventFunc<S, A>>) -> bool;
fn get_pub_event<'a>(&'a mut self) -> LEPubEvent<'a, SenderArgEventFunc<S, A>, S>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
}
}
}
impl<S, A> ListArgsEvent<S, A>
{
pub fn raise(&mut self, sender: &S, event_args: &A) -> usize {
let mut items_to_remove = Vec::new();
let mut index: usize = 0;
for item in self.ble.iter()
{
if !item.contents_ref()(sender, event_args)
{
items_to_remove.push(index);
}
index += 1;
}
self.ble.remove_at_indexes(items_to_remove)
}
}