|
- "use strict";
-
- exports.__esModule = true;
- exports["default"] = void 0;
-
- var _batch = require("./batch");
-
- // encapsulates the subscription logic for connecting a component to the redux store, as
- // well as nesting subscriptions of descendant components, so that we can ensure the
- // ancestor components re-render before descendants
- var nullListeners = {
- notify: function notify() {}
- };
-
- function createListenerCollection() {
- var batch = (0, _batch.getBatch)();
- var first = null;
- var last = null;
- return {
- clear: function clear() {
- first = null;
- last = null;
- },
- notify: function notify() {
- batch(function () {
- var listener = first;
-
- while (listener) {
- listener.callback();
- listener = listener.next;
- }
- });
- },
- get: function get() {
- var listeners = [];
- var listener = first;
-
- while (listener) {
- listeners.push(listener);
- listener = listener.next;
- }
-
- return listeners;
- },
- subscribe: function subscribe(callback) {
- var isSubscribed = true;
- var listener = last = {
- callback: callback,
- next: null,
- prev: last
- };
-
- if (listener.prev) {
- listener.prev.next = listener;
- } else {
- first = listener;
- }
-
- return function unsubscribe() {
- if (!isSubscribed || first === null) return;
- isSubscribed = false;
-
- if (listener.next) {
- listener.next.prev = listener.prev;
- } else {
- last = listener.prev;
- }
-
- if (listener.prev) {
- listener.prev.next = listener.next;
- } else {
- first = listener.next;
- }
- };
- }
- };
- }
-
- var Subscription =
- /*#__PURE__*/
- function () {
- function Subscription(store, parentSub) {
- this.store = store;
- this.parentSub = parentSub;
- this.unsubscribe = null;
- this.listeners = nullListeners;
- this.handleChangeWrapper = this.handleChangeWrapper.bind(this);
- }
-
- var _proto = Subscription.prototype;
-
- _proto.addNestedSub = function addNestedSub(listener) {
- this.trySubscribe();
- return this.listeners.subscribe(listener);
- };
-
- _proto.notifyNestedSubs = function notifyNestedSubs() {
- this.listeners.notify();
- };
-
- _proto.handleChangeWrapper = function handleChangeWrapper() {
- if (this.onStateChange) {
- this.onStateChange();
- }
- };
-
- _proto.isSubscribed = function isSubscribed() {
- return Boolean(this.unsubscribe);
- };
-
- _proto.trySubscribe = function trySubscribe() {
- if (!this.unsubscribe) {
- this.unsubscribe = this.parentSub ? this.parentSub.addNestedSub(this.handleChangeWrapper) : this.store.subscribe(this.handleChangeWrapper);
- this.listeners = createListenerCollection();
- }
- };
-
- _proto.tryUnsubscribe = function tryUnsubscribe() {
- if (this.unsubscribe) {
- this.unsubscribe();
- this.unsubscribe = null;
- this.listeners.clear();
- this.listeners = nullListeners;
- }
- };
-
- return Subscription;
- }();
-
- exports["default"] = Subscription;
|