UNPKG

@tylerbu/sorted-btree-es6

Version:

A sorted list of key-value pairs in a fast, typed in-memory B+ tree with a powerful API.

2 lines (1 loc) 2.49 kB
Object.defineProperty(exports,"__esModule",{value:!0}),exports.diffAgainst=diffAgainst;let b_tree_1=require("../b+tree");function diffAgainst(e,r,i,t,n){var f=e;if(r._compare!==f._compare)throw new Error("Tree comparators are not the same.");if(f.isEmpty||r.isEmpty)return e.isEmpty&&r.isEmpty?void 0:f.isEmpty?void 0===t?void 0:stepToEnd(makeDiffCursor(r),t):void 0===i?void 0:stepToEnd(makeDiffCursor(f),i);var s=f._compare,a=makeDiffCursor(f),l=makeDiffCursor(r);let o=!0,u=!0,c=compareDiffCursors(a,l,s);for(;o&&u;){var p=compareDiffCursors(a,l,s),{leaf:v,internalSpine:h,levelIndices:d}=a,{leaf:m,internalSpine:y,levelIndices:g}=l;if(v||m){if(0!==c)if(0===p){if(v&&m&&n){var k=v.values[d[d.length-1]],C=m.values[g[g.length-1]];if(!Object.is(k,C)){k=n(a.currentKey,k,C);if(k&&k.break)return k.break}}}else if(0<p){if(m&&t){C=m.values[g[g.length-1]],k=t(l.currentKey,C);if(k&&k.break)return k.break}}else if(i&&v&&0!==c){var D=v.values[d[d.length-1]],D=i(a.currentKey,D);if(D&&D.break)return D.break}}else if(!v&&!m&&0===p){D=h.length-1,v=y.length-1,m=h[D][d[D]];if(y[v][g[v]]===m){c=0,o=stepDiffCursor(a,!0),u=stepDiffCursor(l,!0);continue}}(c=p)<0?o=stepDiffCursor(a):u=stepDiffCursor(l)}return o&&i?finishCursorWalk(a,l,s,i):u&&t?finishCursorWalk(l,a,s,t):void 0}function finishCursorWalk(e,r,i,t){r=compareDiffCursors(e,r,i);if(0===r){if(!stepDiffCursor(e))return}else r<0&&(0,b_tree_1.check)(!1,"cursor walk terminated early");return stepToEnd(e,t)}function stepToEnd(e,r){let i=!0;for(;i;){var{leaf:t,levelIndices:n,currentKey:f}=e;if(t){f=r(f,t.values[n[n.length-1]]);if(f&&f.break)return f.break}i=stepDiffCursor(e)}}function makeDiffCursor(e){var r=e._root;return{height:e.height,internalSpine:[[r]],levelIndices:[0],leaf:void 0,currentKey:r.maxKey()}}function stepDiffCursor(r,e){var i,{internalSpine:t,levelIndices:n,leaf:f}=r;if(!0===e||f){var s=n.length;if(!0!==e&&0!==n[s-1])return e=--n[s-1],r.currentKey=f.keys[e],!0;var f=t.length;if(0!==f){var a=f-1;let e=a;for(;0<=e;){if(0<n[e])return e<s-1&&(r.leaf=void 0,n.pop()),e<a&&(r.internalSpine=t.slice(0,e+1)),r.currentKey=t[e][--n[e]].maxKey(),!0;e--}}return!1}return(f=t[f=(e=t.length)-1][n[f]]).isLeaf?(r.leaf=f,i=n[e]=f.values.length-1,r.currentKey=f.keys[i]):(i=f.children,f=(t[e]=i).length-1,n[e]=f,r.currentKey=i[f].maxKey()),!0}function compareDiffCursors(e,r,i){var{height:e,currentKey:t,levelIndices:n}=e,{height:r,currentKey:f,levelIndices:s}=r,i=i(f,t);return 0!==i?i:n.length-(e-(f=e<r?e:r))-(s.length-(r-f))}