function LoopObservable() {
const listeners = new Set();
this.on = fn => listeners.add(fn);
this.off = fn => listeners.delete(fn);
this.clear = () => listeners.clear();
this.send = function(...message) {
for (let fn of listeners)
fn(...message);
};
};
function EventTargetObservable() {
const NAME = '.';
const __ = document.createTextNode(null);
this.on = function(handler) {
__.addEventListener(NAME, event => {
handler(event.detail);
});
};
this.off = function(handler) {
__.removeEventListener(NAME, handler);
};
this.send = function(detail) {
__.dispatchEvent(new CustomEvent(NAME, {detail}));
};
}
class ExtendedEvent extends Event {
constructor(name, data){
super(name);
this.D = data;
}
}
function ExtendedEventTargetObservable() {
const NAME = '.';
const __ = document.createTextNode(null);
this.on = function(handler) {
__.addEventListener(NAME, event => {
handler(event.D);
});
};
this.off = function(handler) {
__.removeEventListener(NAME, handler);
};
this.send = function(data) {
__.dispatchEvent(new ExtendedEvent(NAME, data));
};
}
function run_test(observable, handlers = 2, calls = 1000) {
for (let i = 0; i < handlers; i++)
observable.on(message => console.log(i, message));
for (let i = 0; i < calls; i++)
observable.send({type: "hello", i});
}