start using tinker

This commit is contained in:
2022-02-21 01:50:19 +01:00
parent 829484cb67
commit c78bdab7e4
16 changed files with 172 additions and 255 deletions

View File

@@ -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();
}
}

View File

@@ -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);
}
}