start using tinker
This commit is contained in:
@@ -1,17 +1,17 @@
|
||||
package util;
|
||||
|
||||
import util.Signal.SignalListner;
|
||||
using tink.CoreApi;
|
||||
|
||||
class EventBusListner<T> {
|
||||
class EventBusListner {
|
||||
@:allow(util.EventBus)
|
||||
private final signalListner:SignalListner<T>;
|
||||
private final link:CallbackLink;
|
||||
|
||||
@:allow(util.EventBus)
|
||||
private final eventName:String;
|
||||
|
||||
@:allow(util.EventBus)
|
||||
private function new(signalListner: SignalListner<T>,eventName: String) {
|
||||
this.signalListner = signalListner;
|
||||
private function new(link: CallbackLink,eventName: String) {
|
||||
this.link = link;
|
||||
this.eventName = eventName;
|
||||
}
|
||||
}
|
||||
@@ -20,43 +20,42 @@ class EventBusListner<T> {
|
||||
Generic event handler.
|
||||
**/
|
||||
class EventBus<T>{
|
||||
private var listner: Map<String,Signal<T>> = new Map();
|
||||
private var listner: Map<String,SignalTrigger<T>> = new Map();
|
||||
|
||||
public function new() {
|
||||
|
||||
}
|
||||
|
||||
public function on(eventName: String, callback: T->Void):EventBusListner<T>{
|
||||
public function on(eventName: String, callback: Callback<T>):EventBusListner{
|
||||
if (!listner.exists(eventName)){
|
||||
listner[eventName] = new Signal();
|
||||
listner[eventName] = Signal.trigger();
|
||||
}
|
||||
|
||||
var signalListner = listner[eventName].on(callback);
|
||||
return new EventBusListner(signalListner,eventName);
|
||||
var link = listner[eventName].asSignal().handle(callback);
|
||||
return new EventBusListner(link,eventName);
|
||||
}
|
||||
|
||||
public function once(eventName: String,callback: T->Void):EventBusListner<T> {
|
||||
public function once(eventName: String,callback: Callback<T>):EventBusListner {
|
||||
if (!listner.exists(eventName)){
|
||||
listner[eventName] = new Signal();
|
||||
listner[eventName] = Signal.trigger();
|
||||
}
|
||||
|
||||
var signalListner = listner[eventName].once(callback);
|
||||
return new EventBusListner(signalListner,eventName);
|
||||
var link = listner[eventName].asSignal().handle(callback);
|
||||
return new EventBusListner(link,eventName);
|
||||
}
|
||||
|
||||
public function emit(eventName: String, data: Any) {
|
||||
public function emit(eventName: String, data: T) {
|
||||
if (listner.exists(eventName)){
|
||||
var signal = listner[eventName];
|
||||
signal.emit(data);
|
||||
var trigger = listner[eventName];
|
||||
trigger.trigger(data);
|
||||
}
|
||||
}
|
||||
|
||||
public function removeListner(id: EventBusListner<T>) {
|
||||
public function removeListner(id: EventBusListner) {
|
||||
if (!listner.exists(id.eventName)) {
|
||||
return;
|
||||
}
|
||||
|
||||
listner[id.eventName].remove(id.signalListner);
|
||||
id.link.cancel();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
package util;
|
||||
|
||||
interface SignalReadonly<T> {
|
||||
public function on(cb: T->Void):SignalListner<T>;
|
||||
public function once(cb: T->Void):SignalListner<T>;
|
||||
public function remove(id:SignalListner<T>):Void;
|
||||
}
|
||||
|
||||
class SignalListner<T> {
|
||||
private final callback:T->Void;
|
||||
|
||||
@:allow(util.Signal)
|
||||
private final once:Bool;
|
||||
|
||||
@:allow(util.Signal)
|
||||
private function new(callback: T->Void,?once: Bool = false) {
|
||||
this.callback = callback;
|
||||
this.once = once;
|
||||
}
|
||||
|
||||
@:allow(util.Signal)
|
||||
private function invoke(params: T) {
|
||||
if (callback != null){
|
||||
callback(params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Simple event system for one event type other than EventBus which has multiple events.
|
||||
**/
|
||||
class Signal<T> implements SignalReadonly<T>{
|
||||
public final listner:Array<SignalListner<T>> = new Array();
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function on(cb: T->Void):SignalListner<T> {
|
||||
var l = new SignalListner<T>(cb,false);
|
||||
listner.push(l);
|
||||
return l;
|
||||
}
|
||||
|
||||
public function once(cb: T->Void):SignalListner<T> {
|
||||
var l = new SignalListner<T>(cb,true);
|
||||
listner.push(l);
|
||||
return l;
|
||||
}
|
||||
|
||||
public function emit(data: T) {
|
||||
for (cb in listner){
|
||||
cb.invoke(data);
|
||||
if (cb.once){
|
||||
listner.remove(cb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function remove(id:SignalListner<T> ) {
|
||||
listner.remove(id);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user