123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import { getBatch } from './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 = 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;
- }();
- export { Subscription as default };
|