saij
Version:
A learning engine.
164 lines (133 loc) • 12.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unByKey = unByKey;
exports.default = void 0;
var _Target = _interopRequireDefault(require("./Target.js"));
var _EventType = _interopRequireDefault(require("./EventType.js"));
var _events = require("./utils/events.js");
/**
* @module saij/core/Observable
*/
/* eslint max-len: 0 */
/**
* @classdesc
* Abstract base class; normally only used for creating subclasses and not
* instantiated in apps.
* An event target providing convenient methods for listener registration
* and unregistration. A generic `change` event is always available through
* {@link module:saij/core/Observable~Observable#changed}.
*
* @fires module:saij/core/Event~Event
* @api
*/
class Observable extends _Target.default {
constructor() {
super();
/**
* @private
* @type {number}
*/
this.revision_ = 0;
}
/**
* Increases the revision counter and dispatches a 'change' event.
* @api
*/
changed() {
this.revision_ += 1;
this.dispatchEvent(_EventType.default.CHANGE);
}
/**
* Get the version number for this object. Each time the object is modified,
* its version number will be incremented.
* @return {number} Revision.
* @api
*/
getRevision() {
return this.revision_;
}
/**
* Listen for a certain type of event.
* @param {string|Array<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:saij/core/utils/events~EventsKey|Array<module:saij/core/utils/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
on(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; i += 1) {
keys[i] = (0, _events.listen)(this, type[i], listener);
}
return keys;
}
return (0, _events.listen)(this,
/** @type {string} */
type, listener);
}
/**
* Listen once for a certain type of event.
* @param {string|Array<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:saij/core/utils/events~EventsKey|Array<module:saij/core/utils/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
once(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; i += 1) {
keys[i] = (0, _events.listenOnce)(this, type[i], listener);
}
return keys;
}
return (0, _events.listenOnce)(this,
/** @type {string} */
type, listener);
}
/**
* Unlisten for a certain type of event.
* @param {string|Array<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @api
*/
un(type, listener) {
if (Array.isArray(type)) {
for (let i = 0, ii = type.length; i < ii; i += 1) {
(0, _events.unlisten)(this, type[i], listener);
}
return;
}
(0, _events.unlisten)(this,
/** @type {string} */
type, listener);
}
}
/**
* Removes an event listener using the key returned by `on()` or `once()`.
* @param {module:saij/core/utils/events~EventsKey|Array<module:saij/core/utils/events~EventsKey>} key The key returned by `on()`
* or `once()` (or an array of keys).
* @api
*/
function unByKey(key) {
if (Array.isArray(key)) {
for (let i = 0, ii = key.length; i < ii; i += 1) {
(0, _events.unlistenByKey)(key[i]);
}
} else {
(0, _events.unlistenByKey)(
/** @type {module:saij/core/utils/events~EventsKey} */
key);
}
}
var _default = Observable;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zYWlqL2NvcmUvT2JzZXJ2YWJsZS5qcyJdLCJuYW1lcyI6WyJPYnNlcnZhYmxlIiwiRXZlbnRUYXJnZXQiLCJjb25zdHJ1Y3RvciIsInJldmlzaW9uXyIsImNoYW5nZWQiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnRUeXBlIiwiQ0hBTkdFIiwiZ2V0UmV2aXNpb24iLCJvbiIsInR5cGUiLCJsaXN0ZW5lciIsIkFycmF5IiwiaXNBcnJheSIsImxlbiIsImxlbmd0aCIsImtleXMiLCJpIiwib25jZSIsInVuIiwiaWkiLCJ1bkJ5S2V5Iiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBTEE7Ozs7QUFPQTs7QUFHQTs7Ozs7Ozs7Ozs7QUFXQSxNQUFNQSxVQUFOLFNBQXlCQyxlQUF6QixDQUFxQztBQUNuQ0MsRUFBQUEsV0FBVyxHQUFHO0FBRVo7QUFFQTs7Ozs7QUFJQSxTQUFLQyxTQUFMLEdBQWlCLENBQWpCO0FBRUQ7QUFFRDs7Ozs7O0FBSUFDLEVBQUFBLE9BQU8sR0FBRztBQUNSLFNBQUtELFNBQUwsSUFBa0IsQ0FBbEI7QUFDQSxTQUFLRSxhQUFMLENBQW1CQyxtQkFBVUMsTUFBN0I7QUFDRDtBQUVEOzs7Ozs7OztBQU1BQyxFQUFBQSxXQUFXLEdBQUc7QUFDWixXQUFPLEtBQUtMLFNBQVo7QUFDRDtBQUVEOzs7Ozs7Ozs7OztBQVNBTSxFQUFBQSxFQUFFLENBQUNDLElBQUQsRUFBT0MsUUFBUCxFQUFpQjtBQUNqQixRQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0gsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLFlBQU1JLEdBQUcsR0FBR0osSUFBSSxDQUFDSyxNQUFqQjtBQUNBLFlBQU1DLElBQUksR0FBRyxJQUFJSixLQUFKLENBQVVFLEdBQVYsQ0FBYjs7QUFDQSxXQUFLLElBQUlHLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdILEdBQXBCLEVBQXlCRyxDQUFDLElBQUksQ0FBOUIsRUFBaUM7QUFDL0JELFFBQUFBLElBQUksQ0FBQ0MsQ0FBRCxDQUFKLEdBQVUsb0JBQU8sSUFBUCxFQUFhUCxJQUFJLENBQUNPLENBQUQsQ0FBakIsRUFBc0JOLFFBQXRCLENBQVY7QUFDRDs7QUFDRCxhQUFPSyxJQUFQO0FBQ0Q7O0FBRUQsV0FBTyxvQkFBTyxJQUFQO0FBQWE7QUFBdUJOLElBQUFBLElBQXBDLEVBQTJDQyxRQUEzQyxDQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7QUFTQU8sRUFBQUEsSUFBSSxDQUFDUixJQUFELEVBQU9DLFFBQVAsRUFBaUI7QUFDbkIsUUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNILElBQWQsQ0FBSixFQUF5QjtBQUN2QixZQUFNSSxHQUFHLEdBQUdKLElBQUksQ0FBQ0ssTUFBakI7QUFDQSxZQUFNQyxJQUFJLEdBQUcsSUFBSUosS0FBSixDQUFVRSxHQUFWLENBQWI7O0FBQ0EsV0FBSyxJQUFJRyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSCxHQUFwQixFQUF5QkcsQ0FBQyxJQUFJLENBQTlCLEVBQWlDO0FBQy9CRCxRQUFBQSxJQUFJLENBQUNDLENBQUQsQ0FBSixHQUFVLHdCQUFXLElBQVgsRUFBaUJQLElBQUksQ0FBQ08sQ0FBRCxDQUFyQixFQUEwQk4sUUFBMUIsQ0FBVjtBQUNEOztBQUNELGFBQU9LLElBQVA7QUFDRDs7QUFFRCxXQUFPLHdCQUFXLElBQVg7QUFBaUI7QUFBdUJOLElBQUFBLElBQXhDLEVBQStDQyxRQUEvQyxDQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQVEsRUFBQUEsRUFBRSxDQUFDVCxJQUFELEVBQU9DLFFBQVAsRUFBaUI7QUFDakIsUUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNILElBQWQsQ0FBSixFQUF5QjtBQUN2QixXQUFLLElBQUlPLENBQUMsR0FBRyxDQUFSLEVBQVdHLEVBQUUsR0FBR1YsSUFBSSxDQUFDSyxNQUExQixFQUFrQ0UsQ0FBQyxHQUFHRyxFQUF0QyxFQUEwQ0gsQ0FBQyxJQUFJLENBQS9DLEVBQWtEO0FBQ2hELDhCQUFTLElBQVQsRUFBZVAsSUFBSSxDQUFDTyxDQUFELENBQW5CLEVBQXdCTixRQUF4QjtBQUNEOztBQUNEO0FBQ0Q7O0FBRUQsMEJBQVMsSUFBVDtBQUFlO0FBQXVCRCxJQUFBQSxJQUF0QyxFQUE2Q0MsUUFBN0M7QUFDRDs7QUEzRmtDO0FBK0ZyQzs7Ozs7Ozs7QUFNTyxTQUFTVSxPQUFULENBQWlCQyxHQUFqQixFQUFzQjtBQUMzQixNQUFJVixLQUFLLENBQUNDLE9BQU4sQ0FBY1MsR0FBZCxDQUFKLEVBQXdCO0FBQ3RCLFNBQUssSUFBSUwsQ0FBQyxHQUFHLENBQVIsRUFBV0csRUFBRSxHQUFHRSxHQUFHLENBQUNQLE1BQXpCLEVBQWlDRSxDQUFDLEdBQUdHLEVBQXJDLEVBQXlDSCxDQUFDLElBQUksQ0FBOUMsRUFBaUQ7QUFDL0MsaUNBQWNLLEdBQUcsQ0FBQ0wsQ0FBRCxDQUFqQjtBQUNEO0FBQ0YsR0FKRCxNQUlPO0FBQ0w7QUFBYztBQUF3REssSUFBQUEsR0FBdEU7QUFDRDtBQUNGOztlQUdjdEIsVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBzYWlqL2NvcmUvT2JzZXJ2YWJsZVxuICovXG5pbXBvcnQgRXZlbnRUYXJnZXQgZnJvbSAnLi9UYXJnZXQuanMnO1xuaW1wb3J0IEV2ZW50VHlwZSBmcm9tICcuL0V2ZW50VHlwZS5qcyc7XG5pbXBvcnQge2xpc3RlbiwgdW5saXN0ZW5CeUtleSwgdW5saXN0ZW4sIGxpc3Rlbk9uY2V9IGZyb20gJy4vdXRpbHMvZXZlbnRzLmpzJztcblxuLyogZXNsaW50IG1heC1sZW46IDAgKi9cblxuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3M7IG5vcm1hbGx5IG9ubHkgdXNlZCBmb3IgY3JlYXRpbmcgc3ViY2xhc3NlcyBhbmQgbm90XG4gKiBpbnN0YW50aWF0ZWQgaW4gYXBwcy5cbiAqIEFuIGV2ZW50IHRhcmdldCBwcm92aWRpbmcgY29udmVuaWVudCBtZXRob2RzIGZvciBsaXN0ZW5lciByZWdpc3RyYXRpb25cbiAqIGFuZCB1bnJlZ2lzdHJhdGlvbi4gQSBnZW5lcmljIGBjaGFuZ2VgIGV2ZW50IGlzIGFsd2F5cyBhdmFpbGFibGUgdGhyb3VnaFxuICoge0BsaW5rIG1vZHVsZTpzYWlqL2NvcmUvT2JzZXJ2YWJsZX5PYnNlcnZhYmxlI2NoYW5nZWR9LlxuICpcbiAqIEBmaXJlcyBtb2R1bGU6c2Fpai9jb3JlL0V2ZW50fkV2ZW50XG4gKiBAYXBpXG4gKi9cbmNsYXNzIE9ic2VydmFibGUgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJldmlzaW9uXyA9IDA7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZWFzZXMgdGhlIHJldmlzaW9uIGNvdW50ZXIgYW5kIGRpc3BhdGNoZXMgYSAnY2hhbmdlJyBldmVudC5cbiAgICogQGFwaVxuICAgKi9cbiAgY2hhbmdlZCgpIHtcbiAgICB0aGlzLnJldmlzaW9uXyArPSAxO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChFdmVudFR5cGUuQ0hBTkdFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIG9iamVjdC4gIEVhY2ggdGltZSB0aGUgb2JqZWN0IGlzIG1vZGlmaWVkLFxuICAgKiBpdHMgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBSZXZpc2lvbi5cbiAgICogQGFwaVxuICAgKi9cbiAgZ2V0UmV2aXNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucmV2aXNpb25fO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IHR5cGUgVGhlIGV2ZW50IHR5cGUgb3IgYXJyYXkgb2YgZXZlbnQgdHlwZXMuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oPyk6ID99IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+RXZlbnRzS2V5fEFycmF5PG1vZHVsZTpzYWlqL2NvcmUvdXRpbHMvZXZlbnRzfkV2ZW50c0tleT59IFVuaXF1ZSBrZXkgZm9yIHRoZSBsaXN0ZW5lci4gSWZcbiAgICogICAgIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIGV2ZW50IHR5cGVzIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHJldHVyblxuICAgKiAgICAgd2lsbCBiZSBhbiBhcnJheSBvZiBrZXlzLlxuICAgKiBAYXBpXG4gICAqL1xuICBvbih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICBjb25zdCBsZW4gPSB0eXBlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGtleXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAga2V5c1tpXSA9IGxpc3Rlbih0aGlzLCB0eXBlW2ldLCBsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5cztcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdGVuKHRoaXMsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodHlwZSksIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gb25jZSBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IHR5cGUgVGhlIGV2ZW50IHR5cGUgb3IgYXJyYXkgb2YgZXZlbnQgdHlwZXMuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oPyk6ID99IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+RXZlbnRzS2V5fEFycmF5PG1vZHVsZTpzYWlqL2NvcmUvdXRpbHMvZXZlbnRzfkV2ZW50c0tleT59IFVuaXF1ZSBrZXkgZm9yIHRoZSBsaXN0ZW5lci4gSWZcbiAgICogICAgIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIGV2ZW50IHR5cGVzIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHJldHVyblxuICAgKiAgICAgd2lsbCBiZSBhbiBhcnJheSBvZiBrZXlzLlxuICAgKiBAYXBpXG4gICAqL1xuICBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIGNvbnN0IGxlbiA9IHR5cGUubGVuZ3RoO1xuICAgICAgY29uc3Qga2V5cyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBrZXlzW2ldID0gbGlzdGVuT25jZSh0aGlzLCB0eXBlW2ldLCBsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5cztcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdGVuT25jZSh0aGlzLCAvKiogQHR5cGUge3N0cmluZ30gKi8gKHR5cGUpLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogVW5saXN0ZW4gZm9yIGEgY2VydGFpbiB0eXBlIG9mIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSB0eXBlIFRoZSBldmVudCB0eXBlIG9yIGFycmF5IG9mIGV2ZW50IHR5cGVzLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKD8pOiA/fSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gICAqIEBhcGlcbiAgICovXG4gIHVuKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHR5cGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMSkge1xuICAgICAgICB1bmxpc3Rlbih0aGlzLCB0eXBlW2ldLCBsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdW5saXN0ZW4odGhpcywgLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0eXBlKSwgbGlzdGVuZXIpO1xuICB9XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIHVzaW5nIHRoZSBrZXkgcmV0dXJuZWQgYnkgYG9uKClgIG9yIGBvbmNlKClgLlxuICogQHBhcmFtIHttb2R1bGU6c2Fpai9jb3JlL3V0aWxzL2V2ZW50c35FdmVudHNLZXl8QXJyYXk8bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+RXZlbnRzS2V5Pn0ga2V5IFRoZSBrZXkgcmV0dXJuZWQgYnkgYG9uKClgXG4gKiAgICAgb3IgYG9uY2UoKWAgKG9yIGFuIGFycmF5IG9mIGtleXMpLlxuICogQGFwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5CeUtleShrZXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGtleS5sZW5ndGg7IGkgPCBpaTsgaSArPSAxKSB7XG4gICAgICB1bmxpc3RlbkJ5S2V5KGtleVtpXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHVubGlzdGVuQnlLZXkoLyoqIEB0eXBlIHttb2R1bGU6c2Fpai9jb3JlL3V0aWxzL2V2ZW50c35FdmVudHNLZXl9ICovIChrZXkpKTtcbiAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IE9ic2VydmFibGU7XG4iXX0=