|
|
|
|
@@ -1,4 +1,4 @@
|
|
|
|
|
import { Stream } from "stream";
|
|
|
|
|
import { Stream } from "@brycethorup/stream";
|
|
|
|
|
|
|
|
|
|
export class Interactor {
|
|
|
|
|
#actions = new Stream();
|
|
|
|
|
@@ -7,9 +7,12 @@ export class Interactor {
|
|
|
|
|
#latestReactions = {};
|
|
|
|
|
|
|
|
|
|
constructor(initialReaction = new Reaction()) {
|
|
|
|
|
this.#actions.listen((action) =>
|
|
|
|
|
this[`handle${action.constructor.name}`](action)
|
|
|
|
|
);
|
|
|
|
|
this.#actions.listen((action) => {
|
|
|
|
|
let funcRef = `_handle${action.constructor.name}`;
|
|
|
|
|
if (!this[funcRef])
|
|
|
|
|
throw `${this.constructor.name} does not have a handler defined for the action "${action.constructor.name}". Create one by adding a function definition named "${funcRef}" in the ${this.constructor.name} class.`;
|
|
|
|
|
this[funcRef](action);
|
|
|
|
|
});
|
|
|
|
|
this._react(initialReaction);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -45,8 +48,34 @@ export class Interactor {
|
|
|
|
|
|
|
|
|
|
export class Action {}
|
|
|
|
|
|
|
|
|
|
export class ActionBundle {
|
|
|
|
|
add(action) {
|
|
|
|
|
if (!(action.prototype instanceof Action)) {
|
|
|
|
|
throw "Only classes extended by `Action` can be added to a `ActionBundle`";
|
|
|
|
|
}
|
|
|
|
|
let actionName = action.name;
|
|
|
|
|
this[`#${actionName}`] = action;
|
|
|
|
|
Object.defineProperty(this, actionName, {
|
|
|
|
|
get: () => this[`#${actionName}`],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class Reaction {
|
|
|
|
|
equals(reaction) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class ReactionBundle {
|
|
|
|
|
add(reaction) {
|
|
|
|
|
if (!(reaction.prototype instanceof Reaction)) {
|
|
|
|
|
throw "Only classes extended by `Reaction` can be added to a `ReactionBundle`";
|
|
|
|
|
}
|
|
|
|
|
let reactionName = reaction.name;
|
|
|
|
|
this[`#${reactionName}`] = reaction;
|
|
|
|
|
Object.defineProperty(this, reactionName, {
|
|
|
|
|
get: () => this[`#${reactionName}`],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|