UNPKG

sorted-btree

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.53 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var b_tree_1=require("../b+tree");function diffAgainst(e,r,i,t,n){var f=e,r=r;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);for(var s=f._compare,a=makeDiffCursor(f),u=makeDiffCursor(r),o=!0,l=!0,c=compareDiffCursors(a,u,s);o&&l;){var v=compareDiffCursors(a,u,s),p=a.leaf,h=a.internalSpine,d=a.levelIndices,m=u.leaf,y=u.internalSpine,g=u.levelIndices;if(p||m){if(0!==c)if(0===v){if(p&&m&&n){var k=p.values[d[d.length-1]],C=m.values[g[g.length-1]];if(!Object.is(k,C))if((D=n(a.currentKey,k,C))&&D.break)return D.break}}else if(0<v){if(m&&t){C=m.values[g[g.length-1]];if((D=t(u.currentKey,C))&&D.break)return D.break}}else if(i&&p&&0!==c){var D,k=p.values[d[d.length-1]];if((D=i(a.currentKey,k))&&D.break)return D.break}}else if(!p&&!m&&0===v){p=h.length-1,m=y.length-1,p=h[p][d[p]];if(y[m][g[m]]===p){o=stepDiffCursor(a,!(c=0)),l=stepDiffCursor(u,!0);continue}}(c=v)<0?o=stepDiffCursor(a):l=stepDiffCursor(u)}return o&&i?finishCursorWalk(a,u,s,i):l&&t?finishCursorWalk(u,a,s,t):void 0}function finishCursorWalk(e,r,i,t){i=compareDiffCursors(e,r,i);if(0===i){if(!stepDiffCursor(e))return}else i<0&&(0,b_tree_1.check)(!1,"cursor walk terminated early");return stepToEnd(e,t)}function stepToEnd(e,r){for(var i=!0;i;){var t=e.leaf,n=e.levelIndices,f=e.currentKey;if(t){n=r(f,t.values[n[n.length-1]]);if(n&&n.break)return n.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(e,r){var i=e.internalSpine,t=e.levelIndices,n=e.leaf;if(!0===r||n){var f=t.length;if(!0===r||0===t[f-1]){var s=i.length;if(0===s)return!1;for(var a=s-1,u=a;0<=u;){if(0<t[u])return u<f-1&&(e.leaf=void 0,t.pop()),u<a&&(e.internalSpine=i.slice(0,u+1)),e.currentKey=i[u][--t[u]].maxKey(),!0;u--}return!1}var o=--t[f-1];return e.currentKey=n.keys[o],!0}s=i.length,n=s-1,n=i[n][t[n]];return n.isLeaf?(e.leaf=n,o=t[s]=n.values.length-1,e.currentKey=n.keys[o]):(o=n.children,n=(i[s]=o).length-1,t[s]=n,e.currentKey=o[n].maxKey()),!0}function compareDiffCursors(e,r,i){var t=e.height,n=e.currentKey,f=e.levelIndices,s=r.height,e=r.currentKey,r=r.levelIndices,n=i(e,n);if(0!==n)return n;n=t<s?t:s;return f.length-(t-n)-(r.length-(s-n))}exports.default=diffAgainst;