import { getArrayVal } from "../helper/getArrayVal";
import { inRange } from "./utilities";
import { getEncodingIndexes } from "./encoding-indexes-provider";
/**
 * @param {number} pointer The |pointer| to search for.
 * @param {(!Array.<?number>|undefined)} index The |index| to search within.
 * @return {?number} The code point corresponding to |pointer| in |index|,
 *     or null if |code point| is not in |index|.
 */
export function indexCodePointFor(pointer, index) {
    if (!index)
        return null;
    return index[pointer] || null;
}
/**
 * @param {number} code_point The |code point| to search for.
 * @param {!Array.<?number>} index The |index| to search within.
 * @return {?number} The first pointer corresponding to |code point| in
 *     |index|, or null if |code point| is not in |index|.
 */
export function indexPointerFor(code_point, index) {
    const pointer = index.indexOf(code_point);
    return pointer === -1 ? null : pointer;
}
/**
 * @param {string} name Name of the index.
 * @return {(!Array.<number>|!Array.<Array.<number>>)}
 *  */
export function index(name) {
    const encodingIndexes = getEncodingIndexes();
    if (!encodingIndexes) {
        throw Error("Indexes missing." +
            " Did you forget to include encoding-indexes.js first?");
    }
    return encodingIndexes[name];
}
/**
 * @param {number} pointer The |pointer| to search for in the gb18030 index.
 * @return {?number} The code point corresponding to |pointer| in |index|,
 *     or null if |code point| is not in the gb18030 index.
 */
export function indexGB18030RangesCodePointFor(pointer) {
    // 1. If pointer is greater than 39419 and less than 189000, or
    // pointer is greater than 1237575, return null.
    if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))
        return null;
    // 2. If pointer is 7457, return code point U+E7C7.
    if (pointer === 7457)
        return 0xE7C7;
    // 3. Let offset be the last pointer in index gb18030 ranges that
    // is equal to or less than pointer and let code point offset be
    // its corresponding code point.
    let offset = 0;
    let code_point_offset = 0;
    const idx = index('gb18030-ranges');
    for (let i = 0; i < idx.length; ++i) {
        /** @type {!Array.<number>} */
        const entry = getArrayVal(idx[i]);
        if (entry[0] <= pointer) {
            offset = entry[0];
            code_point_offset = entry[1];
        }
        else {
            break;
        }
    }
    // 4. Return a code point whose value is code point offset +
    // pointer − offset.
    return code_point_offset + pointer - offset;
}
/**
 * @param {number} code_point The |code point| to locate in the gb18030 index.
 * @return {number} The first pointer corresponding to |code point| in the
 *     gb18030 index.
 */
export function indexGB18030RangesPointerFor(code_point) {
    // 1. If code point is U+E7C7, return pointer 7457.
    if (code_point === 0xE7C7)
        return 7457;
    // 2. Let offset be the last code point in index gb18030 ranges
    // that is equal to or less than code point and let pointer offset
    // be its corresponding pointer.
    let offset = 0;
    let pointer_offset = 0;
    const idx = index('gb18030-ranges');
    for (let i = 0; i < idx.length; ++i) {
        const idxVal = idx[i];
        /** @type {!Array.<number>} */
        const entry = getArrayVal(idxVal);
        if (entry[1] <= code_point) {
            offset = entry[1];
            pointer_offset = entry[0];
        }
        else {
            break;
        }
    }
    // 3. Return a pointer whose value is pointer offset + code point
    // − offset.
    return pointer_offset + code_point - offset;
}
/**
 * @param {number} code_point The |code_point| to search for in the Shift_JIS
 *     index.
 * @return {?number} The code point corresponding to |pointer| in |index|,
 *     or null if |code point| is not in the Shift_JIS index.
 */
export function indexShiftJISPointerFor(code_point) {
    // 1. Let index be index jis0208 excluding all entries whose
    // pointer is in the range 8272 to 8835, inclusive.
    shift_jis_index = shift_jis_index ||
        index('jis0208').map(function (code_point, pointer) {
            return inRange(pointer, 8272, 8835) ? null : code_point;
        });
    const index_ = shift_jis_index;
    // 2. Return the index pointer for code point in index.
    return index_.indexOf(code_point);
}
let shift_jis_index;
/**
 * @param {number} code_point The |code_point| to search for in the big5
 *     index.
 * @return {?number} The code point corresponding to |pointer| in |index|,
 *     or null if |code point| is not in the big5 index.
 */
export function indexBig5PointerFor(code_point) {
    // 1. Let index be index Big5 excluding all entries whose pointer
    big5_index_no_hkscs = big5_index_no_hkscs ||
        index('big5').map((code_point, pointer) => (pointer < (0xA1 - 0x81) * 157) ? null : code_point);
    const index_ = big5_index_no_hkscs;
    // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or
    // U+5345, return the last pointer corresponding to code point in
    // index.
    if (code_point === 0x2550 || code_point === 0x255E ||
        code_point === 0x2561 || code_point === 0x256A ||
        code_point === 0x5341 || code_point === 0x5345) {
        return index_.lastIndexOf(code_point);
    }
    // 3. Return the index pointer for code point in index.
    return indexPointerFor(code_point, index_);
}
let big5_index_no_hkscs;
//# sourceMappingURL=indexes.js.map