(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.zustandVanilla = {}));
})(this, (function (exports) { 'use strict';

  var createStoreImpl = function createStoreImpl(createState, configs) {
    var timeout;
    var state;
    var listeners = new Set();
    var setState = function setState(partial, replace) {
      var nextState = typeof partial === 'function' ? partial(state) : partial;
      if (!Object.is(nextState, state)) {
        var _previousState = state;
        state = (replace != null ? replace : typeof nextState !== 'object' || nextState === null) ? nextState : Object.assign({}, state, nextState);
        listeners.forEach(function (listener) {
          return listener(state, _previousState);
        });
      }
    };
    var getState = function getState() {
      return state;
    };
    var getInitialState = function getInitialState() {
      return initialState;
    };
    var resetBasedOnCachTime = function resetBasedOnCachTime() {
      if (!(configs != null && configs.cacheTime)) return;
      if (timeout) clearTimeout(timeout);
      timeout = setTimeout(function () {
        state = createState(setState, getState, api);
      }, configs == null ? void 0 : configs.cacheTime);
    };
    var subscribe = function subscribe(listener) {
      listeners.add(listener);
      if (timeout) clearTimeout(timeout);
      return function () {
        var responseDelete = listeners.delete(listener);
        if (!listeners.size) {
          resetBasedOnCachTime();
        }
        return responseDelete;
      };
    };
    var destroy = function destroy() {
      {
        console.warn('[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.');
      }
      listeners.clear();
    };
    var api = {
      setState: setState,
      getState: getState,
      getInitialState: getInitialState,
      subscribe: subscribe,
      destroy: destroy
    };
    var initialState = state = createState(setState, getState, api);
    return api;
  };
  var createStore = createStoreImpl;
  var vanilla = (function (createState) {
    {
      console.warn("[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.");
    }
    return createStore(createState);
  });

  exports.createStore = createStore;
  exports.default = vanilla;

  Object.defineProperty(exports, '__esModule', { value: true });

}));