"use strict";
// a,g,h,A-Z,,,,-
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRandomCharInSet = getRandomCharInSet;
function getRandomCharInSet(charset) {
    const set = stringToCharSet(charset);
    let charIdx = Math.floor((crypto.getRandomValues(new Uint32Array(1))[0] / 2 ** 32) * set.len);
    for (let range of set.ranges) {
        if (range.len > charIdx) {
            return String.fromCharCode(range.start.charCodeAt(0) + charIdx);
        }
        charIdx -= range.len;
    }
    throw new Error('unreachable');
}
function stringToCharSet(charset) {
    let set = { ranges: [], len: 0 };
    let start = null;
    let end = null;
    let in_range = false;
    for (let char of charset) {
        switch (char) {
            case ',':
                if (start !== null && end !== null) {
                    if (start.charCodeAt(0) > end.charCodeAt(0)) {
                        throw new Error('start > end of charset');
                    }
                    const len = end.charCodeAt(0) - start.charCodeAt(0) + 1;
                    set.ranges.push({
                        start,
                        end,
                        len,
                    });
                    set.len += len;
                    start = null;
                    end = null;
                    in_range = false;
                }
                else if (start !== null && !in_range) {
                    set.len += 1;
                    set.ranges.push({ start, end: start, len: 1 });
                    start = null;
                }
                else if (start !== null && in_range) {
                    end = ',';
                }
                else if (start === null && end === null && !in_range) {
                    start = ',';
                }
                else {
                    throw new Error('unexpected ","');
                }
                break;
            case '-':
                if (start === null) {
                    start = '-';
                }
                else if (!in_range) {
                    in_range = true;
                }
                else if (in_range && end === null) {
                    end = '-';
                }
                else {
                    throw new Error('unexpected "-"');
                }
                break;
            default:
                if (start === null) {
                    start = char;
                }
                else if (in_range && end === null) {
                    end = char;
                }
                else {
                    throw new Error(`unexpected "${char}"`);
                }
        }
    }
    if (start !== null && end !== null) {
        if (start.charCodeAt(0) > end.charCodeAt(0)) {
            throw new Error('start > end of charset');
        }
        const len = end.charCodeAt(0) - start.charCodeAt(0) + 1;
        set.ranges.push({
            start,
            end,
            len,
        });
        set.len += len;
    }
    else if (start !== null) {
        set.len += 1;
        set.ranges.push({
            start,
            end: start,
            len: 1,
        });
    }
    return set;
}
//# sourceMappingURL=getRandomCharInSet.js.map