@rxx/core
Version:
React MVI micro framework.
223 lines • 15.3 kB
JavaScript
"use strict";
/**
* The MIT License (MIT)
* Copyright (c) Taketoshi Aono
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* @fileoverview
* @author Taketoshi Aono
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var state_handler_1 = require("../handler/state-handler");
var utils_1 = require("../utils");
var rxjs_1 = require("rxjs");
/**
* History size.
*/
var MAX_HISTORY_LENGTH = 10;
/**
* Intent decorator that assign StateHandler to instance properties.
*/
function intent(Base) {
var EnhancedIntent = /** @class */ (function (_super) {
tslib_1.__extends(EnhancedIntent, _super);
function EnhancedIntent(dispatch, handlers) {
var _this = _super.call(this, handlers) || this;
_this.dispatch = dispatch;
for (var key in handlers) {
_this[key] = handlers[key];
}
return _this;
}
return EnhancedIntent;
}(Base));
return EnhancedIntent;
}
exports.intent = intent;
/**
* Singleton event publisher.
*/
var Intent = /** @class */ (function (_super) {
tslib_1.__extends(Intent, _super);
function Intent(parent) {
var _this = _super.call(this) || this;
/**
* Event history.
*/
_this.history = [];
_this.children = [];
_this.prepare(parent);
return _this;
}
Intent.prototype.addChild = function (child) {
this.children.push(child);
};
Intent.prototype.removeChild = function (intent) {
var index = this.children.indexOf(intent);
if (index > -1) {
this.children.splice(index, 1);
}
};
Intent.prototype.dispose = function () {
if (this.parent) {
this.parent.removeChild(this);
}
this.children = [];
this.parent = null;
};
Intent.prototype.prepare = function (parent) {
this.parent = parent;
if (this.parent) {
this.parent.addChild(this);
}
};
Intent.prototype.subscribe = function (props) {
return new rxjs_1.Subscription();
};
Intent.prototype.clone = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return this;
};
/**
* Publish event.
* @override
* @param key Event name. If 'RETRY' passed, past published event will be republishing.
* @param args Event args. If a first argument was 'RETRY', specify history index.
* If empty, last event will be publishing.
*/
Intent.prototype.push = function (key, args) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var target, subjects, fire;
var _this = this;
return tslib_1.__generator(this, function (_a) {
if (key === 'RETRY') {
target = args
? this.findHistory(args)
: this.history[this.history.length - 1];
if (target) {
target.fire();
}
return [2 /*return*/];
}
subjects = this.findSubjects(key);
if (!subjects.length) {
return [2 /*return*/];
}
fire = function () {
subjects.forEach(function (subject) {
return subject.next({ data: args, state: _this.state });
});
};
this.history.push({ fire: fire, key: key });
if (this.history.length > MAX_HISTORY_LENGTH) {
this.history.shift();
}
fire();
return [2 /*return*/, Promise.resolve()];
});
});
};
Intent.prototype.getStreamStore = function () {
return this.store;
};
/**
* Return callback function that will publish event.
* @override
* @param key Event name.
* @param v Event args. Override publish args.
*/
Intent.prototype.callback = function (key, v) {
var _this = this;
return function (args) { return _this.push(key, utils_1.isDefined(v) ? v : args); };
};
Intent.prototype.findSubjects = function (key) {
var subjects = this.store.get(key);
if (this.parent) {
subjects = subjects.concat(this.findParentSubjects(key, false));
}
if (this.children.length) {
subjects = subjects.concat(this.findChildrenSubjects(key, false));
}
return subjects;
};
Intent.prototype.findParentSubjects = function (key, searchSelfStore) {
if (searchSelfStore === void 0) { searchSelfStore = true; }
var subjects = searchSelfStore ? this.store.get(key) : [];
if (this.parent) {
return subjects.concat(this.parent.findParentSubjects(key));
}
return subjects;
};
Intent.prototype.findChildrenSubjects = function (key, searchSelfStore) {
if (searchSelfStore === void 0) { searchSelfStore = true; }
var subjects = searchSelfStore ? this.store.get(key) : [];
if (this.children.length) {
return this.children.reduce(function (subject, child) { return subjects.concat(child.findChildrenSubjects(key)); }, subjects);
}
return subjects;
};
Intent.prototype.findHistory = function (retryKey) {
var history = this.history.filter(function (_a) {
var key = _a.key;
return key === retryKey;
})[0];
if (!history && this.parent) {
history = this.findParentHistory(retryKey, false);
}
if (!history && this.children.length) {
history = this.findChildrenHistory(retryKey, false);
}
return history;
};
Intent.prototype.findParentHistory = function (retryKey, searchSelfStore) {
if (searchSelfStore === void 0) { searchSelfStore = true; }
var history = searchSelfStore
? this.history.filter(function (_a) {
var key = _a.key;
return key === retryKey;
})[0]
: null;
if (!history && this.parent) {
return this.parent.findParentHistory(retryKey);
}
return history;
};
Intent.prototype.findChildrenHistory = function (retryKey, searchSelfStore) {
if (searchSelfStore === void 0) { searchSelfStore = true; }
var history = searchSelfStore
? this.history.filter(function (_a) {
var key = _a.key;
return key === retryKey;
})[0]
: null;
if (!history && this.children.length) {
var found_1 = null;
this.children.some(function (child) {
found_1 = child.findChildrenHistory(retryKey);
if (found_1) {
return true;
}
return false;
});
return found_1;
}
return history;
};
return Intent;
}(state_handler_1.StateHandler));
exports.Intent = Intent;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVudC9pbnRlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRzs7O0FBRUgsMERBQXdEO0FBRXhELGtDQUE2QztBQUM3Qyw2QkFBb0M7QUFHcEM7O0dBRUc7QUFDSCxJQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQWlCOUI7O0dBRUc7QUFDSCxTQUFnQixNQUFNLENBQThCLElBQU87SUFDekQ7UUFBNkIsMENBQWE7UUFDeEMsd0JBQVksUUFBUSxFQUFFLFFBQVE7WUFBOUIsWUFDRSxrQkFBTSxRQUFRLENBQUMsU0FLaEI7WUFKQyxLQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixLQUFLLElBQU0sR0FBRyxJQUFJLFFBQVEsRUFBRTtnQkFDMUIsS0FBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMzQjs7UUFDSCxDQUFDO1FBQ0gscUJBQUM7SUFBRCxDQUFDLEFBUkQsQ0FBOEIsSUFBWSxHQVF6QztJQUVELE9BQU8sY0FBcUIsQ0FBQztBQUMvQixDQUFDO0FBWkQsd0JBWUM7QUFFRDs7R0FFRztBQUNIO0lBQTRCLGtDQUFZO0lBVXRDLGdCQUFZLE1BQXNCO1FBQWxDLFlBQ0UsaUJBQU8sU0FFUjtRQVpEOztXQUVHO1FBQ0ssYUFBTyxHQUFvQyxFQUFFLENBQUM7UUFFOUMsY0FBUSxHQUFhLEVBQUUsQ0FBQztRQU05QixLQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztJQUN2QixDQUFDO0lBRU8seUJBQVEsR0FBaEIsVUFBaUIsS0FBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sNEJBQVcsR0FBbkIsVUFBb0IsTUFBYztRQUNoQyxJQUFNLEtBQUssR0FBRyxJ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