Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 95f85aedaa | |||
| 5c7cf36cf3 | |||
| 2a84086828 | |||
| 1dcdc17436 | |||
| 466e95cb14 | |||
| 7ef7c44cf7 | |||
| bf31d5371e | |||
| fc4e96ab37 | |||
| 7af635a19b | |||
| 665dd28f93 | |||
| e026dcdb15 |
2
index.js
2
index.js
@@ -1,2 +0,0 @@
|
||||
import { Interactor, Action, Reaction } from "./interactor.js";
|
||||
export { Interactor, Action, Reaction };
|
||||
@@ -1,44 +1,44 @@
|
||||
import { Stream } from './stream.js';
|
||||
import { Stream } from "stream";
|
||||
|
||||
export class Interactor {
|
||||
_actions = new Stream();
|
||||
_reactions = new Stream();
|
||||
_latestReaction;
|
||||
#actions = new Stream();
|
||||
#reactions = new Stream();
|
||||
#latestReaction;
|
||||
#latestReactions = {};
|
||||
|
||||
constructor(initialReaction = new Reaction()) {
|
||||
this._latestReactions = {};
|
||||
this._actions.listen((action) => this._interaction(action));
|
||||
this.#actions.listen((action) =>
|
||||
this[`handle${action.constructor.name}`](action)
|
||||
);
|
||||
this._react(initialReaction);
|
||||
}
|
||||
|
||||
act(action) {
|
||||
if (!(action instanceof Action)) throw 'invalid action';
|
||||
this._actions.add(action);
|
||||
if (!(action instanceof Action)) throw "invalid action";
|
||||
this.#actions.add(action);
|
||||
}
|
||||
|
||||
observe(reactionHandler, provideLatestReaction = true) {
|
||||
if (provideLatestReaction) reactionHandler(this._latestReaction);
|
||||
if (provideLatestReaction) reactionHandler(this.#latestReaction);
|
||||
let listener = (reaction) => {
|
||||
if (!(reaction instanceof Reaction)) throw 'invalid reaction';
|
||||
if (!(reaction instanceof Reaction)) throw "invalid reaction";
|
||||
reactionHandler(reaction);
|
||||
};
|
||||
this._reactions.listen(listener);
|
||||
this.#reactions.listen(listener);
|
||||
return listener;
|
||||
}
|
||||
|
||||
ignore(listener) {
|
||||
this._reactions.ignore(listener);
|
||||
this.#reactions.ignore(listener);
|
||||
}
|
||||
|
||||
_interaction(action) {}
|
||||
|
||||
_react(reaction) {
|
||||
if (!(reaction instanceof Reaction)) throw 'invalid reaction';
|
||||
let latest = this._latestReactions[reaction.constructor.name];
|
||||
if (!(reaction instanceof Reaction)) throw "invalid reaction";
|
||||
let latest = this.#latestReactions[reaction.constructor.name];
|
||||
if (!reaction.equals(latest)) {
|
||||
this._latestReaction = reaction;
|
||||
this._latestReactions[reaction.constructor.name] = reaction;
|
||||
this._reactions.add(reaction);
|
||||
this.#latestReaction = reaction;
|
||||
this.#latestReactions[reaction.constructor.name] = reaction;
|
||||
this.#reactions.add(reaction);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "interactor",
|
||||
"version": "1.0.4",
|
||||
"version": "1.1.0",
|
||||
"description": "Cross-element communications and state management utility.",
|
||||
"author": "Bryce Thorup",
|
||||
"type": "module",
|
||||
"main": "index.js",
|
||||
"main": "interactor.js",
|
||||
"dependencies": {
|
||||
"stream": "^1.0.0"
|
||||
"stream": "^1.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user