export function fastMerkleRoot( values: Buffer[], digestFn: (b: Buffer) => Buffer, ): Buffer { if (!Array.isArray(values)) throw TypeError('Expected values Array'); if (typeof digestFn !== 'function') throw TypeError('Expected digest Function'); let length = values.length; const results = values.concat(); while (length > 1) { let j = 0; for (let i = 0; i < length; i += 2, ++j) { const left = results[i]; const right = i + 1 === length ? left : results[i + 1]; const data = Buffer.concat([left, right]); results[j] = digestFn(data); } length = j; } return results[0]; }