@luncheon/varint
v1.0.1
Published
A BigInt-native varint codec supporting arbitrary chunk sizes and zigzag encoding.
Downloads
18
Readme
@luncheon/varint
A varint (variable-length integer) encoder / decoder.
BigIntNative- Configurable Chunk Size
- Optional Zigzag Encoding
- Lightweight, Zero Dependencies
import assert from "node:assert/strict";
import { varintEncoder, varintDecoder } from "@luncheon/varint";
const chunkSize = 3;
const zigzag = true;
const encode = varintEncoder(chunkSize, zigzag);
const decode = varintDecoder(chunkSize, zigzag);
encode(0); // => Generator<bigint>
assert.deepEqual(encode( 0).toArray(), [0b000n]);
assert.deepEqual(encode(-1).toArray(), [0b001n]);
assert.deepEqual(encode( 1).toArray(), [0b010n]);
assert.deepEqual(encode(-2).toArray(), [0b011n]);
assert.deepEqual(encode( 2).toArray(), [0b100n, 0b001n]);
assert.deepEqual(encode(-3).toArray(), [0b101n, 0b001n]);
assert.deepEqual(encode( 3).toArray(), [0b110n, 0b001n]);
assert.deepEqual(encode(-4).toArray(), [0b111n, 0b001n]);
assert.deepEqual(encode( 4).toArray(), [0b100n, 0b010n]);
assert.deepEqual(encode(-5).toArray(), [0b101n, 0b010n]);
assert.deepEqual(encode( 5).toArray(), [0b110n, 0b010n]);
assert.deepEqual(encode(-6).toArray(), [0b111n, 0b010n]);
assert.deepEqual(encode( 6).toArray(), [0b100n, 0b011n]);
assert.deepEqual(encode(-7).toArray(), [0b101n, 0b011n]);
assert.deepEqual(encode( 7).toArray(), [0b110n, 0b011n]);
assert.deepEqual(encode(-8).toArray(), [0b111n, 0b011n]);
assert.deepEqual(encode( 8).toArray(), [0b100n, 0b100n, 0b001n]);
for (let n = -1_000_000n; n < 1_000_000n; n++) {
assert.equal(decode(encode(n)), n);
}License
See also
- @luncheon/fibonacci-code: A Fibonacci coding implementation.
