{"version":3,"file":"xy-parser.umd.min.js","sources":["../node_modules/ensure-string/lib/index.js","../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-spectra-processing/lib/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib/x/xCheck.js","../node_modules/ml-spectra-processing/lib/x/xGetFromToIndex.js","../node_modules/ml-spectra-processing/lib/x/xIsMonotonic.js","../node_modules/ml-spectra-processing/lib/xy/xyUniqueX.js","../node_modules/ml-spectra-processing/lib/xy/xyCheck.js","../node_modules/ml-spectra-processing/lib/xy/xySortX.js","../lib/parse.js","../lib/index.js"],"sourcesContent":["/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        if (options.encoding) {\n            return new TextDecoder(options.encoding).decode(blob);\n        }\n        else {\n            return decodeText(blob);\n        }\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction decodeText(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return new TextDecoder('utf-16be').decode(uint8);\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return new TextDecoder('utf-16le').decode(uint8);\n        }\n    }\n    try {\n        return new TextDecoder('utf-8', { fatal: true }).decode(uint8);\n    }\n    catch {\n        return new TextDecoder('latin1').decode(uint8);\n    }\n}\n//# sourceMappingURL=index.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n    const tag = toString.call(value);\n    return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","/**\n * Returns the closest index of a `target`\n * @param array - array of numbers\n * @param target - target\n * @param options\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xCheck } from \"./xCheck.js\";\nimport { xGetFromToIndex } from \"./xGetFromToIndex.js\";\n/**\n * Computes the maximal value of an array of values\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if the input is a non-empty array of numbers.\n * Only checks the first element.\n * @param input - Array to check.\n * @param options - Additional checks.\n */\nexport function xCheck(input, options = {}) {\n    const { minLength } = options;\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    if (typeof input[0] !== 'number') {\n        throw new TypeError('input must contain numbers');\n    }\n    if (minLength && input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","import { xFindClosestIndex } from \"./xFindClosestIndex.js\";\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex } = options;\n    const { from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","/**\n * Returns true if x is monotonic.\n * @param array - array of numbers.\n * @returns 1 if monotonic increasing, -1 if monotonic decreasing, 0 if not monotonic.\n */\nexport function xIsMonotonic(array) {\n    if (array.length <= 2) {\n        return 1;\n    }\n    if (array[0] === array[1]) {\n        // maybe a constant series\n        for (let i = 1; i < array.length - 1; i++) {\n            if (array[i] !== array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    if (array[0] < array.at(-1)) {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] >= array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    else {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] <= array[i + 1])\n                return 0;\n        }\n        return -1;\n    }\n}\n//# sourceMappingURL=xIsMonotonic.js.map","import { xyCheck } from \"./xyCheck.js\";\nimport { xySortX } from \"./xySortX.js\";\n/**\n * Ensure x values are unique\n * @param data - Object that contains property x (Array) and y (Array)\n * @param options - Object containing a property algorithm (can be 'sum' or 'average', the latter being the default value), and a property isSorted (boolean indicating if the x-array is sorted).\n */\nexport function xyUniqueX(data, options = {}) {\n    xyCheck(data);\n    if (data.x.length === 0) {\n        return { x: [], y: [] };\n    }\n    const { algorithm = 'average', isSorted = true } = options;\n    if (!isSorted) {\n        data = xySortX(data);\n    }\n    switch (algorithm) {\n        case 'average':\n            return average(data);\n        case 'sum':\n            return sum(data);\n        default:\n            throw new Error(`unknown algorithm: ${String(algorithm)}`);\n    }\n}\n/**\n * Average.\n * @param data - Input.\n * @returns Result.\n */\nfunction average(data) {\n    const x = [];\n    const y = [];\n    let cumulativeY = data.y[0];\n    let divider = 1;\n    for (let i = 1; i < data.x.length; i++) {\n        if (!(data.x[i] === data.x[i - 1])) {\n            x.push(data.x[i - 1]);\n            y.push(cumulativeY / divider);\n            cumulativeY = 0;\n            divider = 0;\n        }\n        cumulativeY += data.y[i];\n        divider++;\n    }\n    x.push(data.x.at(-1));\n    y.push(cumulativeY / divider);\n    return { x, y };\n}\n/**\n * Sum.\n * @param data - Input.\n * @returns Result.\n */\nfunction sum(data) {\n    const x = [];\n    const y = [];\n    let cumulativeY = data.y[0];\n    for (let i = 1; i < data.x.length; i++) {\n        if (!(data.x[i] === data.x[i - 1])) {\n            x.push(data.x[i - 1]);\n            y.push(cumulativeY);\n            cumulativeY = 0;\n        }\n        cumulativeY += data.y[i];\n    }\n    x.push(data.x.at(-1));\n    y.push(cumulativeY);\n    return { x, y };\n}\n//# sourceMappingURL=xyUniqueX.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Verify that `data` is an object of x,y arrays.\n * Throws an error if it's not.\n * @param data\n * @param options\n * @param options.minLength\n */\nexport function xyCheck(data, options = {}) {\n    const { minLength } = options;\n    if (data === null ||\n        typeof data !== 'object' ||\n        // @ts-expect-error Typechecking\n        !isAnyArray(data.x) ||\n        // @ts-expect-error Typechecking\n        !isAnyArray(data.y)) {\n        throw new Error('data must be an object of x and y arrays');\n    }\n    // @ts-expect-error Typechecking\n    if (data.x.length !== data.y.length) {\n        throw new Error('the x and y arrays must have the same length');\n    }\n    // @ts-expect-error Typechecking\n    if (minLength && data.x.length < minLength) {\n        throw new Error(`data.x must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xyCheck.js.map","import { xIsMonotonic } from \"../x/index.js\";\n/**\n * This function performs a quick sort of the x array while transforming the y array to preserve the coordinates.\n * @param data - Object that contains property x (Array) and y (Array)\n */\nexport function xySortX(data) {\n    const { x, y } = data;\n    if (xIsMonotonic(x) && x.length > 1) {\n        const floatX = Float64Array.from(x);\n        const floatY = Float64Array.from(y);\n        if (floatX.at(-1) < floatX[0]) {\n            floatX.reverse();\n            floatY.reverse();\n        }\n        return {\n            x: floatX,\n            y: floatY,\n        };\n    }\n    const xyObject = Array.from(x, (val, index) => ({\n        x: val,\n        y: y[index],\n    }));\n    xyObject.sort((a, b) => a.x - b.x);\n    const response = {\n        x: new Float64Array(x.length),\n        y: new Float64Array(y.length),\n    };\n    for (let i = 0; i < x.length; i++) {\n        response.x[i] = xyObject[i].x;\n        response.y[i] = xyObject[i].y;\n    }\n    return response;\n}\n//# sourceMappingURL=xySortX.js.map","import { ensureString } from 'ensure-string';\nimport { xIsMonotonic, xMaxValue, xyUniqueX } from 'ml-spectra-processing';\n/**\n * General internal parsing function\n * @param text - Csv or tsv strings.\n * @param options - Parsing options\n * @returns parsed text file with column information\n */\nexport function parse(text, options = {}) {\n    const { rescale = false, uniqueX = false, bestGuess = false, \n    //@ts-expect-error old library used this property and we want to throw an error so that people are forced to migrate\n    keepInfo, } = options;\n    let { xColumn = 0, yColumn = 1, numberColumns = Number.MAX_SAFE_INTEGER, maxNumberColumns = Number.MAX_SAFE_INTEGER, minNumberColumns = 2, } = options;\n    if (keepInfo !== undefined) {\n        throw new Error('keepInfo has been deprecated, please use the new method parseXYAndKeepInfo');\n    }\n    text = ensureString(text);\n    maxNumberColumns = Math.max(maxNumberColumns, xColumn + 1, yColumn + 1);\n    minNumberColumns = Math.max(xColumn + 1, yColumn + 1, minNumberColumns);\n    const lines = text.split(/[\\n\\r]+/);\n    let matrix = [];\n    const info = [];\n    let position = 0;\n    for (let line of lines) {\n        line = line.trim();\n        // we will consider only lines that contains only numbers\n        if (/\\d+/.test(line) && /^[\\d\\t +,.;Ee-]+$/.test(line)) {\n            let fields = line.split(/,[\\t ;]+|[\\t ;]+/);\n            if (fields.length === 1) {\n                fields = line.split(/[\\t ,;]+/);\n            }\n            if (fields &&\n                fields.length >= minNumberColumns && // we filter lines that have not enough or too many columns\n                fields.length <= maxNumberColumns) {\n                matrix.push(fields.map((value) => Number.parseFloat(value.replace(',', '.'))));\n                position++;\n            }\n        }\n        else if (line) {\n            info.push({ position, value: line });\n        }\n    }\n    if (bestGuess) {\n        if (matrix[0]?.length === 3 &&\n            options.xColumn === undefined &&\n            options.yColumn === undefined) {\n            // is the first column a sequential number?\n            let skipFirstColumn = true;\n            for (let i = 0; i < matrix.length - 1; i++) {\n                const currentFirst = matrix[i][0];\n                const nextFirst = matrix[i + 1][0];\n                if (Math.abs(currentFirst - nextFirst) !== 1) {\n                    skipFirstColumn = false;\n                }\n            }\n            if (skipFirstColumn) {\n                xColumn = 1;\n                yColumn = 2;\n            }\n        }\n        if (matrix[0] && matrix[0].length > 3) {\n            const xs = [];\n            for (const row of matrix) {\n                for (let i = xColumn; i < row.length; i += 2) {\n                    xs.push(row[i]);\n                }\n            }\n            if (xIsMonotonic(xs)) {\n                numberColumns = 2;\n            }\n        }\n    }\n    if (numberColumns) {\n        const newMatrix = [];\n        for (const row of matrix) {\n            for (let i = 0; i < row.length; i += numberColumns) {\n                newMatrix.push(row.slice(i, i + numberColumns));\n            }\n        }\n        matrix = newMatrix;\n    }\n    let result = {\n        x: matrix.map((row) => row[xColumn]),\n        y: matrix.map((row) => row[yColumn]),\n    };\n    if (uniqueX) {\n        result = xyUniqueX(result, { algorithm: 'sum' });\n    }\n    if (rescale) {\n        const maxY = xMaxValue(result.y);\n        const yValues = result.y;\n        for (let i = 0; i < yValues.length; i++) {\n            yValues[i] = yValues[i] / maxY;\n        }\n    }\n    return {\n        info,\n        data: result,\n    };\n}\n//# sourceMappingURL=parse.js.map","import { parse } from \"./parse.js\";\nexport * from \"./ParseXYOptions.js\";\n/**\n * Parse a text-file and convert it to an object {x:[], y:[]}\n * @param text - Csv or tsv strings.\n * @param options - Parsing options\n * @returns - The parsed data\n */\nexport function parseXY(text, options = {}) {\n    return parse(text, options).data;\n}\n/**\n * Parse a text-file and returns the parsed data and information about the columns\n * @param text - Csv or tsv strings.\n * @param options - Parsing options\n * @returns - The parsed data with information about the columns\n */\nexport function parseXYAndKeepInfo(text, options = {}) {\n    return parse(text, options);\n}\n//# sourceMappingURL=index.js.map"],"names":["ensureString","blob","options","ArrayBuffer","isView","encoding","TextDecoder","decode","uint8","Uint8Array","buffer","byteOffset","byteLength","length","fatal","decodeText","TypeError","toString","Object","prototype","isAnyArray","value","tag","call","endsWith","includes","xFindClosestIndex","array","target","sorted","low","high","middle","Math","abs","index","diff","Number","POSITIVE_INFINITY","i","currentDiff","xMaxValue","input","minLength","Error","xCheck","fromIndex","toIndex","x","from","to","undefined","xGetFromToIndex","maxValue","xIsMonotonic","at","xyUniqueX","data","y","xyCheck","algorithm","isSorted","floatX","Float64Array","floatY","reverse","xyObject","Array","val","sort","a","b","response","xySortX","cumulativeY","divider","push","average","sum","String","parse","text","rescale","uniqueX","bestGuess","keepInfo","xColumn","yColumn","numberColumns","MAX_SAFE_INTEGER","maxNumberColumns","minNumberColumns","max","lines","split","matrix","info","position","line","trim","test","fields","map","parseFloat","replace","skipFirstColumn","currentFirst","nextFirst","xs","row","newMatrix","slice","result","maxY","yValues"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}