pub struct Listener<T> {
pub name: String,
pub once: bool,
pub listener: fn(&T),
}
pub struct EventEmitter<T> {
pub listeners: Vec<Listener<T>>,
}
impl<T> EventEmitter<T> {
pub fn new() -> Self {
EventEmitter {
listeners: Vec::new(),
}
}
pub fn on(&mut self, name: &str, listener: fn(&T)) {
self.listeners.push(Listener {
name: String::from(name),
once: false,
listener,
});
}
pub fn emit(&mut self, name: &str, value: &T) {
let mut removes = Vec::new();
for (index, context) in self.listeners.iter().enumerate() {
if context.name.as_str() == name {
(context.listener)(value);
if context.once == true {
removes.push(index);
}
}
}
for index in removes.iter() {
self.listeners.remove(*index as usize);
}
}
pub fn event_names(&mut self) -> Vec<&str> {
let mut names = Vec::new();
for context in self.listeners.iter() {
names.push(context.name.as_str());
}
names
}
pub fn listener_count(&mut self, name: &str) -> u8 {
let mut count: u8 = 0;
for context in self.listeners.iter() {
if context.name.as_str() == name {
count += 1;
}
}
count
}
pub fn once(&mut self, name: &str, listener: fn(&T)) {
self.listeners.push(Listener {
name: String::from(name),
once: true,
listener,
});
}
pub fn remove(&mut self, name: &str) {
let mut removes = Vec::new();
for (index, context) in self.listeners.iter().enumerate() {
if context.name.as_str() == name {
removes.push(index);
}
}
for index in removes.iter() {
self.listeners.remove(*index as usize);
}
}
pub fn listeners(&mut self, name: &str) -> Vec<&Listener<T>> {
let mut listener = Vec::new();
for context in self.listeners.iter() {
if context.name.as_str() == name {
listener.push(context);
}
}
listener
}
}