-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy path1-simple.java
73 lines (67 loc) · 2.16 KB
/
1-simple.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.ArrayList;
import java.util.function.Consumer;
/**
* Simple event emitter that allows {@link Consumer}
* objects to be registered as listeners.
* Can emit events, register and delete listeners.
*
* @param <T> type of the listener's parameter
*/
class SimpleEventEmitter<T> {
/**
* Map with all registered events and corresponding listeners.
*/
private final Map<String, List<Consumer<T>>> events;
protected SimpleEventEmitter() {
this.events = new HashMap<>();
}
/**
* Adds new listener to the given event.
*
* @param name event's name
* @param listener action listener
*/
public void on(final String name, final Consumer<T> listener) {
List<Consumer<T>> listeners = Optional.ofNullable(events.get(name))
.orElseGet(ArrayList::new);
listeners.add(listener);
events.put(name, listeners);
}
/**
* Fires event with given data, executing all event listeners.
*
* @param name event's name
* @param data event's data
*/
public void emit(final String name, final T data) {
Optional.ofNullable(events.get(name))
.ifPresent((listeners) -> listeners
.forEach((listener) -> listener.accept(data)));
}
/**
* Removes event listener from specified event.
*
* @param name event's name
* @param listener event listener
* @return {@code true} if the event existed and the listener
* was registered to that event, {@code false} otherwise
*/
public boolean remove(final String name, final Consumer<T> listener) {
return Optional.ofNullable(events.get(name))
.map((listeners) -> listeners.remove(listener))
.orElse(false);
}
/**
* Removes all event listeners from specified event.
*
* @param name event's name
* @return {@code true} if the event existed, {@code false} otherwise
*/
public boolean removeAll(final String name) {
return events.remove(name) != null;
}
}