UNPKG

foop

Version:

interfaces that describe their intentions.

48 lines (42 loc) 4.42 kB
// https://github.com/andrewplummer/Sugar/blob/master/lib/common.js#L766 function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { function next(val, key) { var cyc = false // Allowing a step into the structure before triggering this check to save // cycles on standard JSON structures and also to try as hard as possible to // catch basic properties that may have been modified. if (stack.length > 1) { var i = stack.length while (i--) { if (stack[i] === val) { cyc = true } } } stack.push(val) fn(key, val, cyc, stack) stack.pop() } function iterateWithSortedKeys() { // Sorted keys is required for serialization, where object order // does not matter but stringified order does. var arr = getKeys(obj).sort(), key for (var i = 0; i < arr.length; i++) { key = arr[i] next(obj[key], arr[i]) } } // This method for checking for cyclic structures was egregiously stolen from // the ingenious method by @kitcambridge from the Underscore script: // https://github.com/documentcloud/underscore/issues/240 if (!stack) { stack = [] } if (sortedKeys) { iterateWithSortedKeys() } else { forEachProperty(obj, next) } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aEN5Y2xpY2FsQ2hlY2suanMiLCJzb3VyY2VzIjpbIndpdGhDeWNsaWNhbENoZWNrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdwbHVtbWVyL1N1Z2FyL2Jsb2IvbWFzdGVyL2xpYi9jb21tb24uanMjTDc2NlxuZnVuY3Rpb24gaXRlcmF0ZVdpdGhDeWNsaWNDaGVjayhvYmosIHNvcnRlZEtleXMsIHN0YWNrLCBmbikge1xuICBmdW5jdGlvbiBuZXh0KHZhbCwga2V5KSB7XG4gICAgdmFyIGN5YyA9IGZhbHNlXG5cbiAgICAvLyBBbGxvd2luZyBhIHN0ZXAgaW50byB0aGUgc3RydWN0dXJlIGJlZm9yZSB0cmlnZ2VyaW5nIHRoaXMgY2hlY2sgdG8gc2F2ZVxuICAgIC8vIGN5Y2xlcyBvbiBzdGFuZGFyZCBKU09OIHN0cnVjdHVyZXMgYW5kIGFsc28gdG8gdHJ5IGFzIGhhcmQgYXMgcG9zc2libGUgdG9cbiAgICAvLyBjYXRjaCBiYXNpYyBwcm9wZXJ0aWVzIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZC5cbiAgICBpZiAoc3RhY2subGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGhcbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgaWYgKHN0YWNrW2ldID09PSB2YWwpIHtcbiAgICAgICAgICBjeWMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbClcbiAgICBmbihrZXksIHZhbCwgY3ljLCBzdGFjaylcbiAgICBzdGFjay5wb3AoKVxuICB9XG5cbiAgZnVuY3Rpb24gaXRlcmF0ZVdpdGhTb3J0ZWRLZXlzKCkge1xuICAgIC8vIFNvcnRlZCBrZXlzIGlzIHJlcXVpcmVkIGZvciBzZXJpYWxpemF0aW9uLCB3aGVyZSBvYmplY3Qgb3JkZXJcbiAgICAvLyBkb2VzIG5vdCBtYXR0ZXIgYnV0IHN0cmluZ2lmaWVkIG9yZGVyIGRvZXMuXG4gICAgdmFyIGFyciA9IGdldEtleXMob2JqKS5zb3J0KCksIGtleVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBhcnJbaV1cbiAgICAgIG5leHQob2JqW2tleV0sIGFycltpXSlcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIG1ldGhvZCBmb3IgY2hlY2tpbmcgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzIHdhcyBlZ3JlZ2lvdXNseSBzdG9sZW4gZnJvbVxuICAvLyB0aGUgaW5nZW5pb3VzIG1ldGhvZCBieSBAa2l0Y2FtYnJpZGdlIGZyb20gdGhlIFVuZGVyc2NvcmUgc2NyaXB0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZG9jdW1lbnRjbG91ZC91bmRlcnNjb3JlL2lzc3Vlcy8yNDBcbiAgaWYgKCFzdGFjaykge1xuICAgIHN0YWNrID0gW11cbiAgfVxuXG4gIGlmIChzb3J0ZWRLZXlzKSB7XG4gICAgaXRlcmF0ZVdpdGhTb3J0ZWRLZXlzKClcbiAgfVxuICBlbHNlIHtcbiAgICBmb3JFYWNoUHJvcGVydHkob2JqLCBuZXh0KVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtFQUMxRCxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0lBQ3RCLElBQUksR0FBRyxHQUFHLEtBQUs7Ozs7O0lBS2YsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNwQixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTTtNQUNwQixPQUFPLENBQUMsRUFBRSxFQUFFO1FBQ1YsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1VBQ3BCLEdBQUcsR0FBRyxJQUFJO1NBQ1g7T0FDRjtLQUNGOztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2YsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztJQUN4QixLQUFLLENBQUMsR0FBRyxFQUFFO0dBQ1o7O0VBRUQsU0FBUyxxQkFBcUIsR0FBRzs7O0lBRy9CLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ25DLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7R0FDRjs7Ozs7RUFLRCxJQUFJLENBQUMsS0FBSyxFQUFFO0lBQ1YsS0FBSyxHQUFHLEVBQUU7R0FDWDs7RUFFRCxJQUFJLFVBQVUsRUFBRTtJQUNkLHFCQUFxQixFQUFFO0dBQ3hCO09BQ0k7SUFDSCxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztHQUMzQjtDQUNGOyJ9