const comma = ','.charCodeAt(0);
const semicolon = ';'.charCodeAt(0);
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
const intToChar = new Uint8Array(64); // 64 possible chars.
const charToInteger = new Uint8Array(128); // z is 122 in ASCII
for (let i = 0; i < chars.length; i++) {
    const c = chars.charCodeAt(i);
    charToInteger[c] = i;
    intToChar[i] = c;
}
// Provide a fallback for older environments.
const td = typeof TextDecoder !== 'undefined'
    ? new TextDecoder()
    : typeof Buffer !== 'undefined'
        ? {
            decode(buf) {
                const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
                return out.toString();
            },
        }
        : {
            decode(buf) {
                let out = '';
                for (let i = 0; i < buf.length; i++) {
                    out += String.fromCharCode(buf[i]);
                }
                return out;
            },
        };
function decode(mappings) {
    const state = new Int32Array(5);
    const decoded = [];
    let line = [];
    let sorted = true;
    let lastCol = 0;
    for (let i = 0; i < mappings.length;) {
        const c = mappings.charCodeAt(i);
        if (c === comma) {
            i++;
        }
        else if (c === semicolon) {
            state[0] = lastCol = 0;
            if (!sorted)
                sort(line);
            sorted = true;
            decoded.push(line);
            line = [];
            i++;
        }
        else {
            i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn
            const col = state[0];
            if (col < lastCol)
                sorted = false;
            lastCol = col;
            if (!hasMoreSegments(mappings, i)) {
                line.push([col]);
                continue;
            }
            i = decodeInteger(mappings, i, state, 1); // sourceFileIndex
            i = decodeInteger(mappings, i, state, 2); // sourceCodeLine
            i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn
            if (!hasMoreSegments(mappings, i)) {
                line.push([col, state[1], state[2], state[3]]);
                continue;
            }
            i = decodeInteger(mappings, i, state, 4); // nameIndex
            line.push([col, state[1], state[2], state[3], state[4]]);
        }
    }
    if (!sorted)
        sort(line);
    decoded.push(line);
    return decoded;
}
function decodeInteger(mappings, pos, state, j) {
    let value = 0;
    let shift = 0;
    let integer = 0;
    do {
        const c = mappings.charCodeAt(pos++);
        integer = charToInteger[c];
        value |= (integer & 31) << shift;
        shift += 5;
    } while (integer & 32);
    const shouldNegate = value & 1;
    value >>>= 1;
    if (shouldNegate) {
        value = -0x80000000 | -value;
    }
    state[j] += value;
    return pos;
}
function hasMoreSegments(mappings, i) {
    if (i >= mappings.length)
        return false;
    const c = mappings.charCodeAt(i);
    if (c === comma || c === semicolon)
        return false;
    return true;
}
function sort(line) {
    line.sort(sortComparator);
}
function sortComparator(a, b) {
    return a[0] - b[0];
}
function encode(decoded) {
    const state = new Int32Array(5);
    let buf = new Uint8Array(1024);
    let pos = 0;
    for (let i = 0; i < decoded.length; i++) {
        const line = decoded[i];
        if (i > 0) {
            buf = reserve(buf, pos, 1);
            buf[pos++] = semicolon;
        }
        if (line.length === 0)
            continue;
        state[0] = 0;
        for (let j = 0; j < line.length; j++) {
            const segment = line[j];
            // We can push up to 5 ints, each int can take at most 7 chars, and we
            // may push a comma.
            buf = reserve(buf, pos, 36);
            if (j > 0)
                buf[pos++] = comma;
            pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn
            if (segment.length === 1)
                continue;
            pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex
            pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine
            pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn
            if (segment.length === 4)
                continue;
            pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex
        }
    }
    return td.decode(buf.subarray(0, pos));
}
function reserve(buf, pos, count) {
    if (buf.length > pos + count)
        return buf;
    const swap = new Uint8Array(buf.length * 2);
    swap.set(buf);
    return swap;
}
function encodeInteger(buf, pos, state, segment, j) {
    const next = segment[j];
    let num = next - state[j];
    state[j] = next;
    num = num < 0 ? (-num << 1) | 1 : num << 1;
    do {
        let clamped = num & 0b011111;
        num >>>= 5;
        if (num > 0)
            clamped |= 0b100000;
        buf[pos++] = intToChar[clamped];
    } while (num > 0);
    return pos;
}

export { decode, encode };
//# sourceMappingURL=sourcemap-codec.mjs.map