use serde_json::Value;
use std::collections::HashMap;
pub struct Event {
name: String, data: Option<Value>, }
impl Event {
pub fn new(name: &str, data: Option<Value>) -> Self {
Self {
name: name.to_string(),
data,
}
}
}
type EventListener = fn(Option<Value>);
type ListenersMap = HashMap<String, Vec<EventListener>>;
pub struct EventDispatcher {
listeners: ListenersMap,
}
impl EventDispatcher {
pub fn new() -> Self {
Self {
listeners: HashMap::new(),
}
}
pub fn get_listeners(&self) -> &ListenersMap {
&self.listeners
}
pub fn add_event_listener(&mut self, name: &str, listener: Option<EventListener>) {
let arr = self
.listeners
.entry(name.to_string())
.or_insert_with(Vec::new);
if let Some(x) = listener {
let func = &(x as EventListener);
if !arr.contains(func) {
arr.push(x);
}
}
}
pub fn has_event_listener(&self, name: &str, listener: EventListener) -> bool {
if let Some(listeners) = self.listeners.get(name) {
let func = &(listener);
return listeners.contains(func);
}
false
}
pub fn has_event(&self, name: &str) -> bool {
if let Some(_) = self.listeners.get(name) {
true
} else {
false
}
}
pub fn remove_event_listener(&mut self, name: &str, listener: EventListener) {
if let Some(arr) = self.listeners.get_mut(name) {
arr.retain(|x| format!("{:?}", x) != format!("{:?}", &(listener)));
}
}
pub fn remove_event(&mut self, name: &str) {
if self.listeners.contains_key(name) {
self.listeners.remove(name);
}
}
pub fn dispatch_event(&self, event: Event) {
if let Some(listeners) = self.listeners.get(&event.name) {
for listener in listeners {
listener(event.data.clone());
}
}
}
pub fn once(&self, _name: &str, _listener: Option<EventListener>) {}
pub fn emit(&self, name: &str, params: Option<Value>) {
self.dispatch_event(Event::new(name, params))
}
pub fn on(&mut self, name: &str, listener: Option<EventListener>) {
self.add_event_listener(name, listener);
}
pub fn has(&self, name: &str, listener: Option<EventListener>) -> bool {
if let Some(x) = listener {
self.has_event_listener(name, x)
} else {
self.has_event(name)
}
}
pub fn off(&mut self, name: &str, listener: Option<EventListener>) {
if let Some(func) = listener {
self.remove_event_listener(name, func);
} else {
self.remove_event(name);
}
}
pub fn event_count(&self, name: &str) -> usize {
if let Some(x) = self.listeners.get(name) {
x.len()
} else {
0
}
}
pub fn pop_latest_event(&mut self, name: &str) -> bool {
if let Some(arr) = self.listeners.get_mut(name) {
if let Some(_) = arr.pop() {
return true;
}
}
false
}
pub fn clear(&mut self) {
self.listeners.clear();
}
pub fn useful(&self) -> bool {
self.listeners.keys().len() > 0
}
pub fn on_throttle(&self, _name: &str, _listener: Option<EventListener>, _time: u64) {}
pub fn on_anti_shake(&self, _name: &str, _listener: Option<EventListener>, _time: u64) {}
}