From a632931bc3e4e1a974e00a63ec63fab565fd9ab2 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Sat, 18 Mar 2017 12:26:17 -0400 Subject: [PATCH] Decompose makeGetIndexFunction. --- index.js | 80 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/index.js b/index.js index 7407a70..3f1ae37 100644 --- a/index.js +++ b/index.js @@ -33,44 +33,7 @@ function encode(value) { function toTable(value) { var values = []; - var indexMap = typeof Map === "function" && new Map; - - function getIndex(value) { - switch (typeof value) { - case "undefined": - return UNDEFINED_INDEX; - - case "number": - if (isNaN(value)) { - return NAN_INDEX; - } - - if (! isFinite(value)) { - return value < 0 ? NEG_INF_INDEX : POS_INF_INDEX; - } - - // fall through... - } - - var index; - - if (indexMap) { - // If we have Map, use it instead of values.indexOf to accelerate - // object lookups. - index = indexMap.get(value); - if (typeof index === "undefined") { - index = values.push(value) - 1; - indexMap.set(value, index); - } - } else { - index = values.indexOf(value); - if (index < 0) { - index = values.push(value) - 1; - } - } - - return index; - } + var getIndex = makeGetIndexFunction(values); function copy(value) { var result = value; @@ -150,6 +113,47 @@ function isPlainObject(value) { return false; } +function makeGetIndexFunction(values) { + var indexMap = typeof Map === "function" && new Map; + + return function getIndex(value) { + switch (typeof value) { + case "undefined": + return UNDEFINED_INDEX; + + case "number": + if (isNaN(value)) { + return NAN_INDEX; + } + + if (! isFinite(value)) { + return value < 0 ? NEG_INF_INDEX : POS_INF_INDEX; + } + + // fall through... + } + + var index; + + if (indexMap) { + // If we have Map, use it instead of values.indexOf to accelerate + // object lookups. + index = indexMap.get(value); + if (typeof index === "undefined") { + index = values.push(value) - 1; + indexMap.set(value, index); + } + } else { + index = values.indexOf(value); + if (index < 0) { + index = values.push(value) - 1; + } + } + + return index; + }; +} + exports.decode = exports.parse = function decode(encoding) { return fromTable(JSON.parse(encoding));