lib/index.js
function produce(baseState, producer, patchListener) {
      // prettier-ignore
      if (arguments.length < 1 || arguments.length > 3) throw new Error("produce expects 1 to 3 arguments, got " + arguments.length);

      // curried invocation
      if (typeof baseState === "function") {
          // prettier-ignore
          if (typeof producer === "function") throw new Error("if first argument is a function (curried invocation), the second argument to produce cannot be a function");

          var initialState = producer;
          var recipe = baseState;

          return function () {
              var args = arguments;

              var currentState = args[0] === undefined && initialState !== undefined ? initialState : args[0];

              return produce(currentState, function (draft) {
                  args[0] = draft; // blegh!
                  return recipe.apply(draft, args);
              });
          };
      }

      // prettier-ignore
      {
          if (typeof producer !== "function") throw new Error("if first argument is not a function, the second argument to produce should be a function");
          if (patchListener !== undefined && typeof patchListener !== "function") throw new Error("the third argument of a producer should not be set or a function");
      }

      // if state is a primitive, don't bother proxying at all
      if ((typeof baseState === "undefined" ? "undefined" : _typeof(baseState)) !== "object" || baseState === null) {
          var returnValue = producer(baseState);
          return returnValue === undefined ? baseState : returnValue;
      }

      if (!isProxyable(baseState)) throw new Error("the first argument to an immer producer should be a primitive, plain object or array, got " + (typeof baseState === "undefined" ? "undefined" : _typeof(baseState)) + ": \"" + baseState + "\"");
      return getUseProxies() ? produceProxy(baseState, producer, patchListener) : produceEs5(baseState, producer, patchListener);
  }
function produce(baseState, producer, patchListener) {
      // prettier-ignore
      if (arguments.length < 1 || arguments.length > 3) throw new Error("produce expects 1 to 3 arguments, got " + arguments.length);

      // curried invocation
      if (typeof baseState === "function") {
          // prettier-ignore
          if (typeof producer === "function") throw new Error("if first argument is a function (curried invocation), the second argument to produce cannot be a function");

          var initialState = producer;
          var recipe = baseState;

          return function () {
              var args = arguments;

              var currentState = args[0] === undefined && initialState !== undefined ? initialState : args[0];

              return produce(currentState, function (draft) {
                  args[0] = draft; // blegh!
                  return recipe.apply(draft, args);
              });
          };
      }

      // prettier-ignore
      {
          if (typeof producer !== "function") throw new Error("if first argument is not a function, the second argument to produce should be a function");
          if (patchListener !== undefined && typeof patchListener !== "function") throw new Error("the third argument of a producer should not be set or a function");
      }

      // if state is a primitive, don't bother proxying at all
      if ((typeof baseState === "undefined" ? "undefined" : _typeof(baseState)) !== "object" || baseState === null) {
          var returnValue = producer(baseState);
          return returnValue === undefined ? baseState : returnValue;
      }

      if (!isProxyable(baseState)) throw new Error("the first argument to an immer producer should be a primitive, plain object or array, got " + (typeof baseState === "undefined" ? "undefined" : _typeof(baseState)) + ": \"" + baseState + "\"");
      return getUseProxies() ? produceProxy(baseState, producer, patchListener) : produceEs5(baseState, producer, patchListener);
  }
function produce ( baseState , producer , patchListener ) { // prettier-ignore if ( arguments . length < 1 || arguments . length > 3 ) throw new Error ( "produce expects 1 to 3 arguments, got " + arguments . length ) ; // curried invocation if ( typeof baseState === "function" ) { // prettier-ignore if ( typeof producer === "function" ) throw new Error ( "if first argument is a function (curried invocation), the second argument to produce cannot be a function" ) ; var initialState = producer ; var recipe = baseState ; return function ( ) { var args = arguments ; var currentState = args [ 0 ] === undefined && initialState !== undefined ? initialState : args [ 0 ] ; return produce ( currentState , function ( draft ) { args [ 0 ] = draft ; // blegh! return recipe . apply ( draft , args ) ; } ) ; } ; } // prettier-ignore { if ( typeof producer !== "function" ) throw new Error ( "if first argument is not a function, the second argument to produce should be a function" ) ; if ( patchListener !== undefined && typeof patchListener !== "function" ) throw new Error ( "the third argument of a producer should not be set or a function" ) ; } // if state is a primitive, don't bother proxying at all if ( ( typeof baseState === "undefined" ? "undefined" : _typeof ( baseState ) ) !== "object" || baseState === null ) { var returnValue = producer ( baseState ) ; return returnValue === undefined ? baseState : returnValue ; } if ( ! isProxyable ( baseState ) ) throw new Error ( "the first argument to an immer producer should be a primitive, plain object or array, got " + ( typeof baseState === "undefined" ? "undefined" : _typeof ( baseState ) ) + ": \"" + baseState + "\"" ) ; return getUseProxies ( ) ? produceProxy ( baseState , producer , patchListener ) : produceEs5 ( baseState , producer , patchListener ) ; }
produce takes a state, and runs a function against it.
That function can freely mutate the state, as it will create copies-on-write.
This means that the original state will stay unchanged, and once the function finishes, the modified state is returned

@export
@param {any} baseState - the state to start with
@param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified
@param {Function} patchListener - optional function that will be called with all the patches produces here
@returns {any} a new state, or the base state if nothing was modified
produce takes a state and runs a function against it . That function can freely mutate the state as it will create copies - on - write . This means that the original state will stay unchanged and once the function finishes the modified state is returned