Home Manual Reference Source

src/parts/merge.js

import {tester2} from '../tester.js';

export function _merge(
	_test,
	length,
	heapname,
	makeHeap,
	diffname,
	diff,
	m,
	n,
) {
	const title = `Heap merge (${heapname}, ${diffname}, ${m}, ${n})`;

	_test(title, (t) => {
		const a = [];
		const q = makeHeap(diff);
		const q1 = makeHeap(diff);
		const q2 = makeHeap(diff);

		if (length) t.deepEqual(q1.length, 0, 'check length zero q1');
		if (length) t.deepEqual(q2.length, 0, 'check length zero q2');

		t.deepEqual(q.pop(), undefined, '1st empty pop');

		let i = m;
		while (i--) {
			const x = Math.random();
			q1.push(x);
			a.push(x);
			if (length) t.deepEqual(q1.length, a.length);
		}

		i = n;
		while (i--) {
			const x = Math.random();
			q2.push(x);
			a.push(x);
			if (length) t.deepEqual(q2.length, a.length - m);
		}

		a.sort(diff);

		q.merge(q1);
		q.merge(q2);

		i = m + n;
		const b = [];

		if (length) t.deepEqual(q.length, i);

		while (i--) {
			b.push(q.pop());
			if (length) t.deepEqual(q.length, i);
		}

		t.deepEqual(b, a, 'check sorted');

		t.deepEqual(q.pop(), undefined, '2nd empty pop');

		if (length) t.deepEqual(q.length, 0, 'check length zero q');
	});
}

export const merge = tester2(_merge);