From f05ca1e0256a2a4f329a66921797813c0968a790 Mon Sep 17 00:00:00 2001 From: Andrea Giammarchi Date: Tue, 29 Sep 2020 19:51:34 +0200 Subject: [PATCH] no tail --- cjs/index.js | 22 +++++++++++++++------- es.js | 2 +- esm/index.js | 22 +++++++++++++++------- index.js | 26 +++++++++++++++++++------- min.js | 2 +- 5 files changed, 51 insertions(+), 23 deletions(-) diff --git a/cjs/index.js b/cjs/index.js index c451bf4..ea7ac89 100644 --- a/cjs/index.js +++ b/cjs/index.js @@ -7,6 +7,7 @@ const {keys} = Object; const Primitive = String; // it could be Number const primitive = 'string'; // it could be 'number' +const ignore = {}; const object = 'object'; const noop = (_, value) => value; @@ -20,19 +21,26 @@ const Primitives = (_, value) => ( ); const revive = (input, parsed, output, $) => { + const lazy = []; for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) { - const key = ke[y]; - const value = output[key]; + const k = ke[y]; + const value = output[k]; if (value instanceof Primitive) { const tmp = input[value]; if (typeof tmp === object && !parsed.has(tmp)) { parsed.add(tmp); - output[key] = $.call(output, key, revive(input, parsed, tmp, $)); - } else { - output[key] = $.call(output, key, tmp); + output[k] = ignore; + lazy.push({k, a: [input, parsed, tmp, $]}); } - } else - output[key] = $.call(output, key, value); + else + output[k] = $.call(output, k, tmp); + } + else if (output[k] !== ignore) + output[k] = $.call(output, k, value); + } + for (let {length} = lazy, i = 0; i < length; i++) { + const {k, a} = lazy[i]; + output[k] = $.call(output, k, revive.apply(null, a)); } return output; }; diff --git a/es.js b/es.js index 62bff5c..aee7158 100644 --- a/es.js +++ b/es.js @@ -1,2 +1,2 @@ self.Flatted=function(t){"use strict"; -/*! (c) 2020 Andrea Giammarchi */const{parse:e,stringify:n}=JSON,{keys:r}=Object,s=String,c="string",o="object",l=(t,e)=>e,i=t=>t instanceof s?s(t):t,a=(t,e)=>typeof e===c?new s(e):e,f=(t,e,n,c)=>{for(let l=r(n),{length:i}=l,a=0;a{const r=s(e.push(n)-1);return t.set(n,r),r};return t.parse=(t,n)=>{const r=e(t,a).map(i),s=r[0],c=n||l,u=typeof s===o&&s?f(r,new Set,s,c):s;return c.call({"":u},"",u)},t.stringify=(t,e,r)=>{const s=e&&typeof e===o?(t,n)=>""===t||-1e,i=t=>t instanceof s?s(t):t,f=(t,e)=>typeof e===c?new s(e):e,u=(t,e,n,c)=>{const a=[];for(let i=r(n),{length:f}=i,u=0;u{const r=s(e.push(n)-1);return t.set(n,r),r};return t.parse=(t,n)=>{const r=e(t,f).map(i),s=r[0],c=n||a,l=typeof s===o&&s?u(r,new Set,s,c):s;return c.call({"":l},"",l)},t.stringify=(t,e,r)=>{const s=e&&typeof e===o?(t,n)=>""===t||-1 value; @@ -19,19 +20,26 @@ const Primitives = (_, value) => ( ); const revive = (input, parsed, output, $) => { + const lazy = []; for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) { - const key = ke[y]; - const value = output[key]; + const k = ke[y]; + const value = output[k]; if (value instanceof Primitive) { const tmp = input[value]; if (typeof tmp === object && !parsed.has(tmp)) { parsed.add(tmp); - output[key] = $.call(output, key, revive(input, parsed, tmp, $)); - } else { - output[key] = $.call(output, key, tmp); + output[k] = ignore; + lazy.push({k, a: [input, parsed, tmp, $]}); } - } else - output[key] = $.call(output, key, value); + else + output[k] = $.call(output, k, tmp); + } + else if (output[k] !== ignore) + output[k] = $.call(output, k, value); + } + for (let {length} = lazy, i = 0; i < length; i++) { + const {k, a} = lazy[i]; + output[k] = $.call(output, k, revive.apply(null, a)); } return output; }; diff --git a/index.js b/index.js index 94cf8a4..2cf0eeb 100644 --- a/index.js +++ b/index.js @@ -11,6 +11,7 @@ self.Flatted = (function (exports) { var primitive = 'string'; // it could be 'number' + var ignore = {}; var object = 'object'; var noop = function noop(_, value) { @@ -26,20 +27,31 @@ self.Flatted = (function (exports) { }; var revive = function revive(input, parsed, output, $) { + var lazy = []; + for (var ke = keys(output), length = ke.length, y = 0; y < length; y++) { - var key = ke[y]; - var value = output[key]; + var k = ke[y]; + var value = output[k]; if (value instanceof Primitive) { var tmp = input[value]; if (typeof(tmp) === object && !parsed.has(tmp)) { parsed.add(tmp); - output[key] = $.call(output, key, revive(input, parsed, tmp, $)); - } else { - output[key] = $.call(output, key, tmp); - } - } else output[key] = $.call(output, key, value); + output[k] = ignore; + lazy.push({ + k: k, + a: [input, parsed, tmp, $] + }); + } else output[k] = $.call(output, k, tmp); + } else if (output[k] !== ignore) output[k] = $.call(output, k, value); + } + + for (var _length = lazy.length, i = 0; i < _length; i++) { + var _lazy$i = lazy[i], + _k = _lazy$i.k, + a = _lazy$i.a; + output[_k] = $.call(output, _k, revive.apply(null, a)); } return output; diff --git a/min.js b/min.js index 209b5ea..64372fe 100644 --- a/min.js +++ b/min.js @@ -1,2 +1,2 @@ self.Flatted=function(n){"use strict"; -/*! (c) 2020 Andrea Giammarchi */var t=JSON.parse,r=JSON.stringify,e=Object.keys,i=String,f="string",u="object",a=function(n,t){return t},c=function(n){return n instanceof i?i(n):n},o=function(n,t){return typeof t===f?new i(t):t},l=function(n,t,r){var e=i(t.push(r)-1);return n.set(r,e),e};return n.parse=function(n,r){var f=t(n,o).map(c),l=f[0],s=r||a,p=typeof l===u&&l?function n(t,r,f,a){for(var c=e(f),o=c.length,l=0;l