@dabbott/mutative
Version:
A JavaScript library for efficient immutable updates
3 lines (2 loc) • 22 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@dabbott/mutative"]={})}(this,(function(e){"use strict";const t=Symbol.for("__MUTATIVE_PROXY_DRAFT__"),n=Symbol("__MUTATIVE_RAW_RETURN_SYMBOL__"),r=Symbol.iterator,o={mutable:"mutable",immutable:"immutable"};function i(e,t){return e instanceof Map?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function a(e,t){if(t in e){let n=Reflect.getPrototypeOf(e);for(;n;){const e=Reflect.getOwnPropertyDescriptor(n,t);if(e)return e;n=Reflect.getPrototypeOf(n)}}}function s(e){return Object.getPrototypeOf(e)===Set.prototype}function c(e){return Object.getPrototypeOf(e)===Map.prototype}function l(e){var t;return null!==(t=e.copy)&&void 0!==t?t:e.original}function u(e){return!!p(e)}function p(e){return"object"!=typeof e?null:null==e?void 0:e[t]}function f(e){var t;const n=p(e);return n?null!==(t=n.copy)&&void 0!==t?t:n.original:e}function d(e,t){if(!e||"object"!=typeof e)return!1;let n;return Object.getPrototypeOf(e)===Object.prototype||Array.isArray(e)||e instanceof Map||e instanceof Set||!!(null==t?void 0:t.mark)&&((n=t.mark(e,o))===o.immutable||"function"==typeof n)}function h(e,t=[]){if(Object.hasOwnProperty.call(e,"key")){const n=e.parent.copy,r=p(g(n,e.key));if(null!==r&&(null==r?void 0:r.original)!==e.original)return null;const o=3===e.parent.type,a=o?Array.from(e.parent.setMap.keys()).indexOf(e.key):e.key;if(!(o&&n.size>a||i(n,a)))return null;t.push(a)}if(e.parent)return h(e.parent,t);t.reverse();try{!function(e,t){for(let n=0;n<t.length-1;n+=1){const r=t[n];if("object"!=typeof(e=g(3===y(e)?Array.from(e):e,r)))throw new Error(`Cannot resolve patch at '${t.join("/")}'.`)}}(e.copy,t)}catch(e){return null}return t}function y(e){return Array.isArray(e)?1:e instanceof Map?2:e instanceof Set?3:0}function g(e,t){return 2===y(e)?e.get(t):e[t]}function v(e,t,n){2===y(e)?e.set(t,n):e[t]=n}function b(e,t){const n=p(e);return(n?l(n):e)[t]}function m(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function w(e){if(e)for(;e.finalities.revoke.length>0;){e.finalities.revoke.pop()()}}function O(e,t){return t?e:[""].concat(e).map((e=>{const t=`${e}`;return-1===t.indexOf("/")&&-1===t.indexOf("~")?t:t.replace(/~/g,"~0").replace(/\//g,"~1")})).join("/")}function M(e){return Array.isArray(e)?e:e.split("/").map((e=>e.replace(/~1/g,"/").replace(/~0/g,"~"))).slice(1)}const k=Object.prototype.propertyIsEnumerable;function j(e,t){let n;if(Array.isArray(e))return Array.prototype.concat.call(e);if(e instanceof Set){if(!s(e)){return new(0,Object.getPrototypeOf(e).constructor)(e.values())}return Set.prototype.difference?Set.prototype.difference.call(e,new Set):new Set(e.values())}if(e instanceof Map){if(!c(e)){return new(0,Object.getPrototypeOf(e).constructor)(e)}return new Map(e)}if((null==t?void 0:t.mark)&&(n=t.mark(e,o),void 0!==n)&&n!==o.mutable){if(n===o.immutable)return function(e){const t=Object.create(Object.getPrototypeOf(e));return Reflect.ownKeys(e).forEach((n=>{let r=Reflect.getOwnPropertyDescriptor(e,n);r.enumerable&&r.configurable&&r.writable?t[n]=e[n]:(r.writable||(r.writable=!0,r.configurable=!0),(r.get||r.set)&&(r={configurable:!0,writable:!0,enumerable:r.enumerable,value:e[n]}),Reflect.defineProperty(t,n,r))})),t}(e);if("function"==typeof n)return n();throw new Error(`Unsupported mark result: ${n}`)}if("object"==typeof e&&Object.getPrototypeOf(e)===Object.prototype){const t={};return Object.keys(e).forEach((n=>{t[n]=e[n]})),Object.getOwnPropertySymbols(e).forEach((n=>{k.call(e,n)&&(t[n]=e[n])})),t}throw new Error("Please check mark() to ensure that it is a stable marker draftable function.")}function S(e){e.copy||(e.copy=j(e.original,e.options))}function P(e){if(!d(e))return f(e);if(Array.isArray(e))return e.map(P);if(e instanceof Map){const t=Array.from(e.entries()).map((([e,t])=>[e,P(t)]));if(!c(e)){return new(0,Object.getPrototypeOf(e).constructor)(t)}return new Map(t)}if(e instanceof Set){const t=Array.from(e).map(P);if(!s(e)){return new(0,Object.getPrototypeOf(e).constructor)(t)}return new Set(t)}const t=Object.create(Object.getPrototypeOf(e));for(const n in e)t[n]=P(e[n]);return t}function R(e){return u(e)?P(e):e}function A(e){var t;e.assignedMap=null!==(t=e.assignedMap)&&void 0!==t?t:new Map,e.operated||(e.operated=!0,e.parent&&A(e.parent))}function E(){throw new Error("Cannot modify frozen object")}function z(e){return e&&"object"==typeof e&&!Object.isFrozen(e)}function x(e,t,n,r,o){if(Object.isFrozen(e)||u(e))return;switch(y(e)){case 2:for(const[t,n]of e)z(t)&&x(t),z(n)&&x(n);e.set=e.clear=e.delete=E;break;case 3:for(const t of e)z(t)&&x(t);e.add=e.clear=e.delete=E;break;case 1:Object.freeze(e);for(const t of e)z(t)&&x(t);break;default:Object.freeze(e),Object.keys(e).forEach((t=>{const n=e[t];z(n)&&x(n)}))}}function D(e,t){const n=y(e);if(0===n)Reflect.ownKeys(e).forEach((n=>{t(n,e[n],e)}));else if(1===n){let n=0;for(const r of e)t(n,r,e),n+=1}else e.forEach(((n,r)=>t(r,n,e)))}function _(e,t,n){if(u(e)||!d(e,n)||t.has(e)||Object.isFrozen(e))return;const r=e instanceof Set,o=r?new Map:void 0;if(t.add(e),D(e,((i,a)=>{var s;if(u(a)){const t=p(a);S(t);const n=(null===(s=t.assignedMap)||void 0===s?void 0:s.size)||t.operated?t.copy:t.original;v(r?o:e,i,n)}else _(a,t,n)})),o){const t=e,n=Array.from(t);t.clear(),n.forEach((e=>{t.add(o.has(e)?o.get(e):e)}))}}function I(e,t){const n=3===e.type?e.setMap:e.copy;e.finalities.revoke.length>1&&e.assignedMap.get(t)&&n&&_(g(n,t),e.finalities.handledSet,e.options)}function N(e){3===e.type&&e.copy&&(e.copy.clear(),e.setMap.forEach((t=>{e.copy.add(f(t))})))}function F(e,t,n,r){if(e.operated&&e.assignedMap&&e.assignedMap.size>0&&!e.finalized){if(n&&r){const o=h(e);o&&t(e,o,n,r)}e.finalized=!0}}function C(e,t,n,r){const o=p(n);o&&(o.callbacks||(o.callbacks=[]),o.callbacks.push(((i,a)=>{const s=3===e.type?e.setMap:e.copy;if(m(g(s,t),n)){let n=o.original;o.copy&&(n=o.copy),N(e),F(e,r,i,a),v(s,t,n)}})),e.options.enableAutoFreeze&&o.finalities!==e.finalities&&(e.options.enableAutoFreeze=!1)),d(n,e.options)&&e.finalities.draft.push((()=>{m(g(3===e.type?e.setMap:e.copy,t),n)&&I(e,t)}))}function T(e){const{rootDraft:t,value:n,useRawReturn:r=!1,isRoot:o=!0}=e;D(n,((n,r,o)=>{const i=p(r);if(i&&t&&i.finalities===t.finalities){e.isContainDraft=!0;const t=i.original;if(o instanceof Set){const e=Array.from(o);o.clear(),e.forEach((e=>o.add(n===e?t:e)))}else v(o,n,t)}else"object"==typeof r&&null!==r&&(e.value=r,e.isRoot=!1,T(e))}))}function $(e){var t;const n=p(e);if(!d(e,null==n?void 0:n.options))return e;const r=y(e);if(n&&!n.operated)return n.original;let o;function i(){o=2===r?c(e)?new Map(e):new(Object.getPrototypeOf(e).constructor)(e):3===r?Array.from(n.setMap.values()):j(e,null==n?void 0:n.options)}if(n){n.finalized=!0;try{i()}finally{n.finalized=!1}}else o=e;if(D(o,((t,r)=>{if(n&&m(g(n.original,t),r))return;const a=$(r);a!==r&&(o===e&&i(),v(o,t,a))})),3===r){const e=null!==(t=null==n?void 0:n.original)&&void 0!==t?t:o;return s(e)?new Set(o):new(Object.getPrototypeOf(e).constructor)(o)}return o}function K(e){if(!u(e))throw new Error(`current() is only used for Draft, parameter: ${e}`);return $(e)}const V={Remove:"remove",Replace:"replace",Add:"add",Move:"move"},U={};function W(e,t,n,r){const{pathAsArray:o=!0}=e.options.enablePatches,a=e.options.createArrayPatches;switch(e.type){case 0:case 2:return function({original:e,copy:t,assignedMap:n},r,o,a,s){n.forEach(((n,c)=>{const l=g(e,c),u=R(g(t,c)),p=n?i(e,c)?V.Replace:V.Add:V.Remove;if(m(l,u)&&p===V.Replace)return;const f=O(r.concat(c),s);o.push(p===V.Remove?{op:p,path:f}:{op:p,path:f,value:u}),a.push(p===V.Add?{op:V.Remove,path:f}:p===V.Remove?{op:V.Add,path:f,value:l}:{op:V.Replace,path:f,value:l})}))}(e,t,n,r,o);case 1:return function(e,t,n,r,o,i){let{original:a,assignedMap:s,options:c}=e,l=e.copy;const u={isAssigned:e=>!!s.get(e.toString()),cloneIfNeeded:R,concatPath:e=>O(t.concat([e]),o),basePath:t,original:a,copy:l};if(i){const e=i(u);if(e)return n.push(...e.patches),void r.push(...e.inversePatches)}l.length<a.length&&([a,l]=[l,a],[n,r]=[r,n]);for(let e=0;e<a.length;e+=1)if(s.get(e.toString())&&l[e]!==a[e]){const t=u.concatPath(e);n.push({op:V.Replace,path:t,value:u.cloneIfNeeded(l[e])}),r.push({op:V.Replace,path:t,value:u.cloneIfNeeded(a[e])})}for(let e=a.length;e<l.length;e+=1){const t=u.concatPath(e);n.push({op:V.Add,path:t,value:u.cloneIfNeeded(l[e])})}if(a.length<l.length){const{arrayLengthAssignment:e=!0}=c.enablePatches;if(e){const e=u.concatPath("length");r.push({op:V.Replace,path:e,value:a.length})}else for(let e=l.length;a.length<e;e-=1){const t=u.concatPath(e-1);r.push({op:V.Remove,path:t})}}}(e,t,n,r,o,a);case 3:return function({original:e,copy:t},n,r,o,i){let a=0;e.forEach((e=>{if(!t.has(e)){const t=O(n.concat([a]),i);r.push({op:V.Remove,path:t,value:e}),o.unshift({op:V.Add,path:t,value:e})}a+=1})),a=0,t.forEach((t=>{if(!e.has(t)){const e=O(n.concat([a]),i);r.push({op:V.Add,path:e,value:t}),o.unshift({op:V.Remove,path:e,value:t})}a+=1}))}(e,t,n,r,o)}}let L=!1;const Y=(e,t,n=!1)=>{if("object"==typeof e&&null!==e&&(!d(e,t)||n)&&!L)throw new Error("Strict mode: Mutable data cannot be accessed directly, please use 'unsafe(callback)' wrap.")};const B={get size(){return l(p(this)).size},has(e){return l(p(this)).has(e)},set(e,t){const n=p(this),r=l(n);return r.has(e)&&m(r.get(e),t)||(S(n),A(n),n.assignedMap.set(e,!0),n.copy.set(e,t),C(n,e,t,W)),this},delete(e){if(!this.has(e))return!1;const t=p(this);return S(t),A(t),t.original.has(e)?t.assignedMap.set(e,!1):t.assignedMap.delete(e),t.copy.delete(e),!0},clear(){const e=p(this);if(this.size){S(e),A(e),e.assignedMap=new Map;for(const[t]of e.original)e.assignedMap.set(t,!1);e.copy.clear()}},forEach(e,t){l(p(this)).forEach(((n,r)=>{e.call(t,this.get(r),r,this)}))},get(e){var t,n;const r=p(this),i=l(r).get(e),a=(null===(n=(t=r.options).mark)||void 0===n?void 0:n.call(t,i,o))===o.mutable;if(r.options.strict&&Y(i,r.options,a),a)return i;if(r.finalized||!d(i,r.options))return i;if(i!==r.original.get(e))return i;const s=U.createDraft({original:i,parentDraft:r,key:e,finalities:r.finalities,options:r.options});return S(r),r.copy.set(e,s),s},keys(){return l(p(this)).keys()},values(){const e=this.keys();return{[r]:()=>this.values(),next:()=>{const t=e.next();if(t.done)return t;return{done:!1,value:this.get(t.value)}}}},entries(){const e=this.keys();return{[r]:()=>this.entries(),next:()=>{const t=e.next();if(t.done)return t;const n=this.get(t.value);return{done:!1,value:[t.value,n]}}}},[r](){return this.entries()}},X=Reflect.ownKeys(B),q=(e,t,{isValuesIterator:n})=>()=>{var r,i;const a=t.next();if(a.done)return a;const s=a.value;let c=e.setMap.get(s);const l=p(c),u=(null===(i=(r=e.options).mark)||void 0===i?void 0:i.call(r,c,o))===o.mutable;if(e.options.strict&&Y(s,e.options,u),u||l||!d(s,e.options)||e.finalized||!e.original.has(s))l&&(c=l.proxy);else{const t=U.createDraft({original:s,parentDraft:e,key:s,finalities:e.finalities,options:e.options});e.setMap.set(s,t),c=t}return{done:!1,value:n?c:[c,c]}},G={get size(){return p(this).setMap.size},has(e){const t=p(this);if(t.setMap.has(e))return!0;S(t);const n=p(e);return!(!n||!t.setMap.has(n.original))},add(e){const t=p(this);return this.has(e)||(S(t),A(t),t.assignedMap.set(e,!0),t.setMap.set(e,e),C(t,e,e,W)),this},delete(e){if(!this.has(e))return!1;const t=p(this);S(t),A(t);const n=p(e);return n&&t.setMap.has(n.original)?(t.assignedMap.set(n.original,!1),t.setMap.delete(n.original)):(!n&&t.setMap.has(e)?t.assignedMap.set(e,!1):t.assignedMap.delete(e),t.setMap.delete(e))},clear(){if(!this.size)return;const e=p(this);S(e),A(e);for(const t of e.original)e.assignedMap.set(t,!1);e.setMap.clear()},values(){const e=p(this);S(e);const t=e.setMap.keys();return{[Symbol.iterator]:()=>this.values(),next:q(e,t,{isValuesIterator:!0})}},entries(){const e=p(this);S(e);const t=e.setMap.keys();return{[Symbol.iterator]:()=>this.entries(),next:q(e,t,{isValuesIterator:!1})}},keys(){return this.values()},[r](){return this.values()},forEach(e,t){const n=this.values();let r=n.next();for(;!r.done;)e.call(t,r.value,r.value,this),r=n.next()}};Set.prototype.difference&&Object.assign(G,{intersection(e){return Set.prototype.intersection.call(new Set(this.values()),e)},union(e){return Set.prototype.union.call(new Set(this.values()),e)},difference(e){return Set.prototype.difference.call(new Set(this.values()),e)},symmetricDifference(e){return Set.prototype.symmetricDifference.call(new Set(this.values()),e)},isSubsetOf(e){return Set.prototype.isSubsetOf.call(new Set(this.values()),e)},isSupersetOf(e){return Set.prototype.isSupersetOf.call(new Set(this.values()),e)},isDisjointFrom(e){return Set.prototype.isDisjointFrom.call(new Set(this.values()),e)}});const H=Reflect.ownKeys(G),J=new WeakSet,Q={get(e,n,r){var s,c;const u=null===(s=e.copy)||void 0===s?void 0:s[n];if(u&&J.has(u))return u;if(n===t)return e;let f;if(e.options.mark){const t="size"===n&&(e.original instanceof Map||e.original instanceof Set)?Reflect.get(e.original,n):Reflect.get(e.original,n,r);if(f=e.options.mark(t,o),f===o.mutable)return e.options.strict&&Y(t,e.options,!0),t}const h=l(e);if(h instanceof Map&&X.includes(n)){if("size"===n)return Object.getOwnPropertyDescriptor(B,"size").get.call(e.proxy);const t=B[n];if(t)return t.bind(e.proxy)}if(h instanceof Set&&H.includes(n)){if("size"===n)return Object.getOwnPropertyDescriptor(G,"size").get.call(e.proxy);const t=G[n];if(t)return t.bind(e.proxy)}if(!i(h,n)){const t=a(h,n);return t?"value"in t?t.value:null===(c=t.get)||void 0===c?void 0:c.call(e.proxy):void 0}const y=h[n];if(e.options.strict&&Y(y,e.options),e.finalized||!d(y,e.options))return y;if(y===b(e.original,n)){if(S(e),e.copy[n]=Z({original:e.original[n],parentDraft:e,key:1===e.type?Number(n):n,finalities:e.finalities,options:e.options}),"function"==typeof f){const t=p(e.copy[n]);return S(t),A(t),t.copy}return e.copy[n]}return y},set(e,t,n){var r;if(3===e.type||2===e.type)throw new Error("Map/Set draft does not support any property assignment.");let o;if(1===e.type&&"length"!==t&&(!(Number.isInteger(o=Number(t))&&o>=0)||0!==t&&0!==o&&String(o)!==String(t)))throw new Error("Only supports setting array indices and the 'length' property.");const s=a(l(e),t);if(null==s?void 0:s.set)return s.set.call(e.proxy,n),!0;const c=b(l(e),t),u=p(c);return u&&m(u.original,n)?(e.copy[t]=n,e.assignedMap=null!==(r=e.assignedMap)&&void 0!==r?r:new Map,e.assignedMap.set(t,!1),!0):(m(n,c)&&(void 0!==n||i(e.original,t))||(S(e),A(e),i(e.original,t)&&m(n,e.original[t])?e.assignedMap.delete(t):e.assignedMap.set(t,!0),e.copy[t]=n,C(e,t,n,W)),!0)},has:(e,t)=>t in l(e),ownKeys:e=>Reflect.ownKeys(l(e)),getOwnPropertyDescriptor(e,t){const n=l(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},getPrototypeOf:e=>Reflect.getPrototypeOf(e.original),setPrototypeOf(){throw new Error("Cannot call 'setPrototypeOf()' on drafts")},defineProperty(){throw new Error("Cannot call 'defineProperty()' on drafts")},deleteProperty(e,t){var n;return 1===e.type?Q.set.call(this,e,t,void 0,e.proxy):(void 0!==b(e.original,t)||t in e.original?(S(e),A(e),e.assignedMap.set(t,!1)):(e.assignedMap=null!==(n=e.assignedMap)&&void 0!==n?n:new Map,e.assignedMap.delete(t)),e.copy&&delete e.copy[t],!0)}};function Z(e){const{original:t,parentDraft:n,key:r,finalities:o,options:i}=e,a=y(t),s={type:a,finalized:!1,parent:n,original:t,copy:null,proxy:null,finalities:o,options:i,setMap:3===a?new Map(t.entries()):void 0};(r||"key"in e)&&(s.key=r);const{proxy:c,revoke:l}=Proxy.revocable(1===a?Object.assign([],s):s,Q);if(o.revoke.push(l),J.add(c),s.proxy=c,n){const e=n;e.finalities.draft.push(((t,n)=>{var o;const i=p(c);let a=3===e.type?e.setMap:e.copy;const s=g(a,r),l=p(s);if(l){let e=l.original;l.operated&&(e=f(s)),N(l),F(l,W,t,n),v(a,r,e)}null===(o=i.callbacks)||void 0===o||o.forEach((e=>{e(t,n)}))}))}else{const e=p(c);e.finalities.draft.push(((t,n)=>{N(e),F(e,W,t,n)}))}return c}function ee(e,t,n,r,o){var i;const a=p(e),s=null!==(i=null==a?void 0:a.original)&&void 0!==i?i:e,c=!!t.length;if(null==a?void 0:a.operated)for(;a.finalities.draft.length>0;){a.finalities.draft.pop()(n,r)}const l=c?t[0]:a?a.operated?a.copy:a.original:e;return a&&w(a),o&&x(l,0,null==a||a.options.updatedValues),[l,n&&c?[{op:V.Replace,path:[],value:t[0]}]:n,r&&c?[{op:V.Replace,path:[],value:s}]:r]}U.createDraft=Z;const te=e=>function t(r,i,a){var s,c,l;if("function"==typeof r&&"function"!=typeof i)return function(e,...n){return t(e,(e=>r.call(this,e,...n)),i)};const f=r,h=i;let y=a;"function"!=typeof i&&(y=i),y=Object.assign(Object.assign({},e),y);const g=u(f)?K(f):f,v=Array.isArray(y.mark)?(e,t)=>{for(const n of y.mark){const r=n(e,t);if(r)return r}}:y.mark,b=null!==(s=y.enablePatches)&&void 0!==s&&s,O=null!==(c=y.strict)&&void 0!==c&&c,M={enableAutoFreeze:null!==(l=y.enableAutoFreeze)&&void 0!==l&&l,mark:v,strict:O,enablePatches:b,createArrayPatches:y.createArrayPatches};if(!d(g,M)&&"object"==typeof g&&null!==g)throw new Error("Invalid base state: create() only supports plain objects, arrays, Set, Map or using mark() to mark the state as immutable.");const[k,j]=function(e,t){var n;const r={draft:[],revoke:[],handledSet:new WeakSet};let i,a;t.enablePatches&&(i=[],a=[]);const s=(null===(n=t.mark)||void 0===n?void 0:n.call(t,e,o))!==o.mutable&&d(e,t)?Z({original:e,parentDraft:null,finalities:r,options:t}):e;return[s,(e=[])=>{const[n,r,o]=ee(s,e,i,a,t.enableAutoFreeze);return t.enablePatches?[n,r,o]:n}]}(g,M);if("function"!=typeof i){if(!d(g,M))throw new Error("Invalid base state: create() only supports plain objects, arrays, Set, Map or using mark() to mark the state as immutable.");return[k,j]}let S;try{S=h(k)}catch(e){throw w(p(k)),e}const P=e=>{const t=p(k);if(!u(e)){if(void 0!==e&&!m(e,k)&&(null==t?void 0:t.operated))throw new Error("Either the value is returned as a new non-draft value, or only the draft is modified without returning any value.");const r=null==e?void 0:e[n];if(r){const n=r[0];return M.strict&&"object"==typeof e&&null!==e&&T({rootDraft:t,value:e,useRawReturn:!0}),j([n])}if(void 0!==e)return"object"==typeof e&&null!==e&&T({rootDraft:t,value:e}),j([e])}if(e===k||void 0===e)return j([]);const r=p(e);if(M===r.options){if(r.operated)throw new Error("Cannot return a modified child draft.");return j([K(e)])}return j([e])};return S instanceof Promise?S.then(P,(e=>{throw w(p(k)),e})):P(S)},ne=te();function re(e,t){var n;const r=Number(t.path[t.path.length-1]),o=null!==(n=t.length)&&void 0!==n?n:1;switch(t.op){case"add":return e.slice(0,r)+t.value+e.slice(r);case"remove":return e.slice(0,r)+e.slice(r+o);case"replace":return e.slice(0,r)+t.value+e.slice(r+o);default:return e}}function oe(e,t){let n=e;for(let e=0;e<t.length-1;e+=1){const r=y(n);let o=t[e];if("string"!=typeof o&&"number"!=typeof o&&(o=String(o)),(0===r||1===r)&&("__proto__"===o||"constructor"===o)||"function"==typeof n&&"prototype"===o)throw new Error("Patching reserved attributes like __proto__ and constructor is not allowed.");if(n=g(3===r?Array.from(n):n,o),"object"!=typeof n&&"string"!=typeof n)throw new Error(`Cannot apply patch at '${t.join("/")}'.`)}return n}const ie=Object.prototype.constructor.toString();e.apply=function(e,t,n){let r;for(r=t.length-1;r>=0;r-=1){const{value:n,op:o,path:i,from:a}=t[r];if(!i.length&&o===V.Replace||""===i&&o===V.Add){e=n;break}if(!i.length&&o===V.Move){const t=M(a);e=P(oe(e,t)[t[t.length-1]]);break}}r>-1&&(t=t.slice(r+1));const o=e=>{t.forEach((t=>{const{path:n,from:r,op:o}=t,i=M(n);let a=oe(e,i);if("string"==typeof a){const n=i.slice(0,-1),r=oe(e,n),o=i[i.length-2];if(void 0===o)return;return void(r[o]=re(r[o],t))}const s=y(a),c=P(t.value),l=i[i.length-1];switch(o){case V.Move:{const t=M(r),n=oe(e,t),o=t[t.length-1],u=y(n);if(n===a&&o===l)return;const p=P(n[o]);if(0===i.length)return;if(n===a&&1===u&&1===s){const e=Number(o),t=Number(l);return e<t?(a.splice(e,1),void a.splice(t,0,p)):(a.splice(t,0,p),void a.splice(e+1,1))}switch(u){case 1:const e=Number(o);n.splice(e,1);break;case 2:n.delete(o);break;case 3:n.delete(c);break;default:delete n[o]}switch(s){case 1:const e=Number(l);a.splice(e,0,p);break;case 2:a.set(l,p);break;case 3:a.add(p);break;default:a[l]=p}return}case V.Replace:switch(s){case 2:return a.set(l,c);case 3:throw new Error("Cannot apply replace patch to set.");default:return a[l]=c}case V.Add:switch(s){case 1:return"-"===l?a.push(c):a.splice(l,0,c);case 2:return a.set(l,c);case 3:return a.add(c);default:return a[l]=c}case V.Remove:switch(s){case 1:return a.splice(l,1);case 2:return a.delete(l);case 3:return a.delete(t.value);default:return delete a[l]}default:throw new Error(`Unsupported patch operation: ${o}.`)}}))};if(!(null==n?void 0:n.mutable)){if(u(e)){if(void 0!==n)throw new Error("Cannot apply patches with options to a draft.");return o(e),e}return ne(e,o,Object.assign(Object.assign({},n),{enablePatches:!1}))}o(e)},e.applyPatchToString=re,e.castDraft=function(e){return e},e.castImmutable=function(e){return e},e.castMutable=function(e){return e},e.create=ne,e.current=K,e.isDraft=u,e.isDraftable=d,e.makeCreator=te,e.markSimpleObject=e=>{if((e=>{if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);if(null===t)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object||"function"==typeof n&&Function.toString.call(n)===ie})(e))return o.immutable},e.original=function(e){const t=p(e);if(!t)throw new Error(`original() is only used for a draft, parameter: ${e}`);return t.original},e.rawReturn=function(e){if(0===arguments.length)throw new Error("rawReturn() must be called with a value.");if(arguments.length>1)throw new Error("rawReturn() must be called with one argument.");return{[n]:[e]}},e.unsafe=function(e){let t;L=!0;try{t=e()}finally{L=!1}return t}}));
//# sourceMappingURL=mutative.umd.production.min.js.map