Comparing version
@@ -10,2 +10,3 @@ declare type RemitterDatalessEventName<TConfig> = { | ||
private readonly relayListeners_; | ||
private onceListeners_?; | ||
/** | ||
@@ -21,2 +22,6 @@ * Emit an event to `eventName` listeners. | ||
/** | ||
* Add a one-time listener to the eventName. | ||
*/ | ||
once<TEventName extends RemitterEventNames<TConfig>>(eventName: TEventName, listener: RemitterListener<TConfig, TEventName>): RemitterDisposer; | ||
/** | ||
* Remove a listener from the eventName. | ||
@@ -23,0 +28,0 @@ */ |
@@ -9,4 +9,12 @@ "use strict"; | ||
emit(eventName, eventData) { | ||
var _a; | ||
(_a = this.a.get(eventName)) == null ? void 0 : _a.forEach((listener) => listener(eventData)); | ||
const listeners = this.a.get(eventName); | ||
if (listeners) { | ||
for (const listener of listeners) { | ||
try { | ||
listener(eventData); | ||
} catch (e) { | ||
console.error(e); | ||
} | ||
} | ||
} | ||
} | ||
@@ -21,3 +29,5 @@ on(eventName, listener) { | ||
if (listeners.size === 1) { | ||
this.b.forEach((listener2) => listener2.d(eventName)); | ||
for (const listener2 of this.b) { | ||
listener2.e(eventName); | ||
} | ||
} | ||
@@ -28,9 +38,23 @@ return () => { | ||
} | ||
once(eventName, listener) { | ||
const onceListener = (eventData) => { | ||
this.off(eventName, listener); | ||
return listener(eventData); | ||
}; | ||
this.c = this.c || /* @__PURE__ */ new WeakMap(); | ||
this.c.set(listener, onceListener); | ||
return this.on(eventName, onceListener); | ||
} | ||
off(eventName, listener) { | ||
var _a; | ||
const listeners = this.a.get(eventName); | ||
if (listeners) { | ||
const result = listeners.delete(listener); | ||
const result = listeners.delete( | ||
((_a = this.c) == null ? void 0 : _a.get(listener)) || listener | ||
); | ||
if (listeners.size <= 0) { | ||
this.a.delete(eventName); | ||
this.b.forEach((listener2) => listener2.c(eventName)); | ||
for (const listener2 of this.b) { | ||
listener2.d(eventName); | ||
} | ||
} | ||
@@ -55,5 +79,5 @@ return result; | ||
let count = 0; | ||
this.a.forEach((listeners) => { | ||
for (const listeners of this.a.values()) { | ||
count += listeners.size; | ||
}); | ||
} | ||
return count; | ||
@@ -66,10 +90,18 @@ } | ||
const relayListener = { | ||
d: (name) => { | ||
e: (name) => { | ||
if (name === eventName) { | ||
disposer = start(this); | ||
try { | ||
disposer = start(this); | ||
} catch (e) { | ||
console.error(e); | ||
} | ||
} | ||
}, | ||
c: (name) => { | ||
d: (name) => { | ||
if (disposer && (!name || name === eventName)) { | ||
disposer(); | ||
try { | ||
disposer(); | ||
} catch (e) { | ||
console.error(e); | ||
} | ||
} | ||
@@ -79,10 +111,8 @@ } | ||
this.b.add(relayListener); | ||
if ((((_a = this.a.get(eventName)) == null ? void 0 : _a.size) || 0) > 0) { | ||
disposer = start(this); | ||
if ((_a = this.a.get(eventName)) == null ? void 0 : _a.size) { | ||
relayListener.e(eventName); | ||
} | ||
return () => { | ||
this.b.delete(relayListener); | ||
if (disposer) { | ||
disposer(); | ||
} | ||
relayListener.d(); | ||
}; | ||
@@ -92,3 +122,5 @@ } | ||
this.clear(); | ||
this.b.forEach((listener) => listener.c()); | ||
for (const listener of this.b) { | ||
listener.d(); | ||
} | ||
this.b.clear(); | ||
@@ -95,0 +127,0 @@ } |
{ | ||
"name": "remitter", | ||
"version": "0.2.8", | ||
"version": "0.2.9", | ||
"private": false, | ||
@@ -5,0 +5,0 @@ "description": "A TypeScript friendly event emitter with easy re-emitting events.", |
@@ -16,3 +16,3 @@ # remitter | ||
A TypeScript friendly event emitter with easy re-emitting events. | ||
A tiny TypeScript friendly event emitter that supports easy re-emitting events. | ||
@@ -41,4 +41,10 @@ ## Install | ||
remitter.count("event1"); // 1 | ||
remitter.once("event1", value => { | ||
console.log("event1-once", value); | ||
}); | ||
remitter.count("event1"); // 2 | ||
remitter.emit("event1", "hello"); // logs "event1 hello" and "event1-once hello" | ||
remitter.emit("event1", "hello"); // logs "event1 hello" | ||
@@ -59,3 +65,3 @@ | ||
You may tap into other events which will be lazy-executed when listener count of an event name grows from 0 to 1 and be disposed when listener count drops from 1 to 0. | ||
You may tap into other events easily with `remit`. It is lazy-executed when listener count of the event name grows from 0 to 1. It is disposed when listener count of the event name drops from 1 to 0. | ||
@@ -62,0 +68,0 @@ ```js |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
30606
19.92%293
30.8%96
6.67%