@gmod/cram
Version:
read CRAM files with pure Javascript
60 lines (52 loc) • 1.67 kB
text/typescript
import BetaCodec from './beta.ts'
import ByteArrayLengthCodec from './byteArrayLength.ts'
import ByteArrayStopCodec from './byteArrayStop.ts'
import ExternalCodec from './external.ts'
import GammaCodec from './gamma.ts'
import HuffmanIntCodec from './huffman.ts'
import SubexpCodec from './subexp.ts'
import { CramUnimplementedError } from '../../errors.ts'
import type CramCodec from './_base.ts'
import type { DataType } from './dataSeriesTypes.ts'
import type { CramEncoding } from '../encoding.ts'
const codecClasses = {
1: ExternalCodec,
// 2: GolombCodec,
3: HuffmanIntCodec,
4: ByteArrayLengthCodec,
5: ByteArrayStopCodec,
6: BetaCodec,
7: SubexpCodec,
// 8: GolombRiceCodec,
9: GammaCodec,
}
type CramCodecFactory = <TData extends DataType = DataType>(
encodingData: CramEncoding,
dataType: TData | 'ignore',
) => CramCodec<TData>
type CramCodecConstructor = new (
parameters: unknown,
dataType: DataType,
factory: CramCodecFactory,
) => CramCodec
function getCodecClassWithId(id: number): CramCodecConstructor | undefined {
return (codecClasses as Record<number, CramCodecConstructor | undefined>)[id]
}
export function instantiateCodec<TResult extends DataType = DataType>(
encodingData: CramEncoding,
dataType: DataType | 'ignore',
): CramCodec<TResult> {
const CodecClass = getCodecClassWithId(
dataType === 'ignore' ? 0 : encodingData.codecId,
)
if (!CodecClass) {
throw new CramUnimplementedError(
`no codec implemented for codec ID ${encodingData.codecId}`,
)
}
return new CodecClass(
encodingData.parameters,
dataType as DataType,
instantiateCodec,
) as CramCodec<TResult>
}