@protorians/core
Version:
Protorians Core
62 lines (61 loc) • 1.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Capability = void 0;
exports.createCapability = createCapability;
const signal_1 = require("./signal");
class Capability {
constructor(signal) {
this.signal = signal;
}
apply(name, callable) {
this.signal.listen(name, callable);
return this;
}
call(name, args) {
this.signal.dispatch(name, args);
return this;
}
removeEntry(type, index) {
this.signal.remove(type, index);
return this;
}
remove(type) {
this.signal.removeStack(type);
return this;
}
removeAll(types) {
this.signal.removeStacks(types);
return this;
}
removeCallable(callable, type) {
this.signal.removeCallable(callable, type);
return this;
}
reset() {
this.signal.clear();
return this;
}
}
exports.Capability = Capability;
function createCapability(options) {
const signal = new signal_1.Signal.Stack();
const initial = {};
const callable = function (key, arg) {
signal.dispatch(key, arg);
return signal.computed(key);
};
const handler = {
get(target, prop, receiver) {
const value = Reflect.get(target, prop, receiver);
if (typeof value === 'function') {
return function (arg) { return callable(prop, arg); };
}
return value;
}
};
options.methods.forEach(key => initial[key] = () => signal.computed(key));
return {
current: new Proxy(initial, handler),
capability: new Capability(signal),
};
}