UNPKG

@gmod/bbi

Version:

Parser for BigWig/BigBed files

47 lines (40 loc) 1.41 kB
// from https://github.com/yume-chan/ya-webadb/blob/main/libraries/dataview-bigint-polyfill // license:MIT // needed for browsers including safari 14 const BigInt32 = BigInt(32) export function getBigInt64( dataView: DataView, byteOffset: number, littleEndian: boolean | undefined, ): bigint { const littleEndianMask = Number(!!littleEndian) const bigEndianMask = Number(!littleEndian) return ( (BigInt( dataView.getInt32(byteOffset, littleEndian) * bigEndianMask + dataView.getInt32(byteOffset + 4, littleEndian) * littleEndianMask, ) << BigInt32) | BigInt( dataView.getUint32(byteOffset, littleEndian) * littleEndianMask + dataView.getUint32(byteOffset + 4, littleEndian) * bigEndianMask, ) ) } export function getBigUint64( dataView: DataView, byteOffset: number, littleEndian: boolean | undefined, ): bigint { const a = dataView.getUint32(byteOffset, littleEndian) const b = dataView.getUint32(byteOffset + 4, littleEndian) const littleEndianMask = Number(!!littleEndian) const bigEndianMask = Number(!littleEndian) // This branch-less optimization is 77x faster than normal ternary operator. // and only 3% slower than native implementation // https://jsbench.me/p8kyhg1eqv/1 return ( (BigInt(a * bigEndianMask + b * littleEndianMask) << BigInt32) | BigInt(a * littleEndianMask + b * bigEndianMask) ) }