+ return [objs, mods, dels, inss];
+ },
+
+ stableKeypathLengthSort: function(stanzas) {
+ var comparator = function (a, b) {
+ var swap;
+ if (a[0].length === b[0].length) {
+ return a[0][0] - b[0][0];
+ }
+ return b[0].length - a[0].length;
+ }
+ for (var i = 0; i < stanzas.length; i++) {
+ stanzas[i][0].unshift(i)
+ }
+ stanzas.sort(comparator)
+ for (i = 0; i < stanzas.length; i++) {
+ stanzas[i][0].shift()
+ }
+ return stanzas
+ },
+
+ keypathCompare: function(a, b) {
+ a = a[0]; b = b[0];
+ if (a.length !== b.length) {
+ return a.length - b.length;
+ }
+ for (var i = 0; i < a.length; i++) {
+ if (typeof a[i] === 'number' && a[i] !== b[i]) {
+ return a[i] - b[i];
+ }
+ }
+ return 0;
+ },
+
+ keypathCompareReverse: function(a, b) {
+ a = a[0]; b = b[0];
+ if (a.length !== b.length) {
+ return b.length - a.length;
+ }
+ for (var i = 0; i < a.length; i++) {
+ if (typeof a[i] === 'number' && a[i] !== b[i]) {
+ return b[i] - a[i];
+ }
+ }
+ return 0;