{"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/utils/helpers.ts","../src/_internals.ts","../src/array/joins.ts","../src/array/utils.ts","../src/array/stats.ts","../src/array/transform.ts"],"sourcesContent":["export type Predicate<T = any> = (p: T) => boolean;\r\nexport type Selector<T = any, V = any> = (p: T) => V;\r\nexport class ParsingOptions {\r\n  delimiter = ',';\r\n  skipRows = 0;\r\n  keepOriginalHeaders = false;\r\n  textFields: string[] = [];\r\n  dateFields: (string | string[])[] = [];\r\n  numberFields: string[] = [];\r\n  booleanFields: string[] = [];\r\n  skipUntil?: (tokens: string[]) => boolean;\r\n  takeWhile?: (tokens: string[]) => boolean;\r\n  parseFields?: {};\r\n  elementSelector?: (fieldDescriptions: FieldDescription[], tokens: string[]) => any;\r\n}\r\n\r\nexport type PrimitiveType = string | number | bigint | boolean | null;\r\n\r\n/**\r\n * ScalarType represent a single value types what includes Date and can be null\r\n */\r\nexport type ScalarType = PrimitiveType | Date;\r\n\r\n/**\r\n * Scalar object is a simple object where key is always string and value could be a ScalarType only\r\n * Scalar type includes Date object\r\n */\r\nexport type ScalarObject = Record<string, ScalarType>;\r\n\r\n/**\r\n * PrimitivesObject is a simple object where key is a string and value can be Primitive\r\n * This object can be transfered with REST call. Doesn'r have a Date\r\n */\r\nexport type PrimitivesObject = Record<string, PrimitiveType>;\r\n\r\n/**\r\n * Commonly used and recognized types\r\n */\r\nexport enum DataTypeName {\r\n  String = 'String',\r\n  LargeString = 'LargeString',\r\n  WholeNumber = 'WholeNumber',\r\n  BigIntNumber = 'BigIntNumber',\r\n  FloatNumber = 'FloatNumber',\r\n  DateTime = 'DateTime',\r\n  Date = 'Date',\r\n  Boolean = 'Boolean'\r\n}\r\n\r\nexport interface Table<T> {\r\n  fieldDataTypes?: DataTypeName[];\r\n  fieldNames: string[];\r\n  rows: T[][];\r\n}\r\n\r\n/**\r\n * A simple data table structure what provides a most efficient way\r\n * to send data across the wire\r\n */\r\nexport type TableDto = Table<PrimitiveType>;\r\n\r\nexport type ScallarTable = Table<ScalarType>;\r\n\r\nexport interface StringsDataTable extends Table<string> {\r\n  fieldDescriptions: FieldDescription[];\r\n}\r\n\r\nexport interface FieldDescription {\r\n  index: number;\r\n  fieldName: string;\r\n  isNullable: boolean;\r\n  isUnique: boolean;\r\n  isObject: boolean;\r\n  maxSize?: number;\r\n  dataTypeName?: DataTypeName;\r\n}\r\n","import { Selector, FieldDescription, DataTypeName, ScalarType, PrimitiveType } from '../types';\r\n\r\n/**\r\n * Formats selected value to number.\r\n * @private\r\n * @param val Primitive or object.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function parseNumber(val: ScalarType, elementSelector?: Selector): number | undefined {\r\n  if (elementSelector && typeof elementSelector === 'function') {\r\n    val = elementSelector(val);\r\n  }\r\n  if (val instanceof Date) {\r\n    return val.getTime();\r\n  }\r\n  switch (typeof val) {\r\n    case 'string': {\r\n      const fV = parseFloat(val);\r\n      if (!isNaN(fV)) {\r\n        return fV;\r\n      }\r\n      break;\r\n    }\r\n    case 'boolean':\r\n      return Number(val);\r\n    case 'number':\r\n      return isNaN(val) ? undefined : val;\r\n  }\r\n}\r\n\r\nexport function parseNumberOrNull(value: string | number): number | null {\r\n  if (typeof value === 'number') {\r\n    return value;\r\n  }\r\n\r\n  if (!value || typeof value !== 'string') {\r\n    return null;\r\n  }\r\n\r\n  value = value.trim();\r\n\r\n  // Just to make sure string contains digits only and '.', ','. Otherwise, parseFloat can incorrectly parse into number\r\n  for (let i = value.length - 1; i >= 0; i--) {\r\n    const d = value.charCodeAt(i);\r\n    if (d < 48 || d > 57) {\r\n      // '.' - 46 ',' - 44 '-' - 45(but only first char)\r\n      if (d !== 46 && d !== 44 && (d !== 45 || i !== 0)) return null;\r\n    }\r\n  }\r\n\r\n  const res = parseFloat(value.replace(/,/g, ''));\r\n  return !isNaN(res) ? res : null;\r\n}\r\n\r\n/**\r\n * More wider datetime parser\r\n * @param value\r\n */\r\nexport function parseDatetimeOrNull(\r\n  value: string | Date | number,\r\n  format: string | null = null\r\n): Date | null {\r\n  format = (format || '').toLowerCase();\r\n  if (!value) {\r\n    return null;\r\n  }\r\n  if (value instanceof Date && !isNaN(value.valueOf())) {\r\n    return value;\r\n  }\r\n\r\n  // only string values can be converted to Date\r\n  const tpOf = typeof value;\r\n  if (tpOf === 'number' || tpOf === 'bigint') {\r\n    return new Date(value);\r\n  } else if (tpOf !== 'string') {\r\n    return null;\r\n  }\r\n\r\n  value = value as string;\r\n\r\n  const strValue = String(value);\r\n  if (!strValue.length) {\r\n    return null;\r\n  }\r\n\r\n  const parseMonth = (mm: string): number => {\r\n    if (!mm || !mm.length) {\r\n      return NaN;\r\n    }\r\n\r\n    const m = parseInt(mm, 10);\r\n    if (!isNaN(m)) {\r\n      return m - 1;\r\n    }\r\n\r\n    // make sure english months are coming through\r\n    if (mm.startsWith('jan')) {\r\n      return 0;\r\n    }\r\n    if (mm.startsWith('feb')) {\r\n      return 1;\r\n    }\r\n    if (mm.startsWith('mar')) {\r\n      return 2;\r\n    }\r\n    if (mm.startsWith('apr')) {\r\n      return 3;\r\n    }\r\n    if (mm.startsWith('may')) {\r\n      return 4;\r\n    }\r\n    if (mm.startsWith('jun')) {\r\n      return 5;\r\n    }\r\n    if (mm.startsWith('jul')) {\r\n      return 6;\r\n    }\r\n    if (mm.startsWith('aug')) {\r\n      return 7;\r\n    }\r\n    if (mm.startsWith('sep')) {\r\n      return 8;\r\n    }\r\n    if (mm.startsWith('oct')) {\r\n      return 9;\r\n    }\r\n    if (mm.startsWith('nov')) {\r\n      return 10;\r\n    }\r\n    if (mm.startsWith('dec')) {\r\n      return 11;\r\n    }\r\n\r\n    return NaN;\r\n  };\r\n\r\n  const correctYear = (yy: number): number => {\r\n    if (yy < 100) {\r\n      return yy < 68 ? yy + 2000 : yy + 1900;\r\n    } else {\r\n      return yy;\r\n    }\r\n  };\r\n\r\n  const validDateOrNull = (\r\n    yyyy: number,\r\n    month: number,\r\n    day: number,\r\n    hours: number,\r\n    mins: number,\r\n    ss: number,\r\n    ms: number\r\n  ): Date | null => {\r\n    if (month > 11 || day > 31 || hours >= 60 || mins >= 60 || ss >= 60) {\r\n      return null;\r\n    }\r\n\r\n    if (ms > 1000) {\r\n      ms = parseInt(String(ms).substring(0, 3));\r\n    }\r\n    const dd = new Date(yyyy, month, day, hours, mins, ss, ms);\r\n    return !isNaN(dd.valueOf()) ? dd : null;\r\n  };\r\n\r\n  const strTokens = strValue\r\n    .replace('T', ' ')\r\n    .replace('Z', ' ')\r\n    .replace('.', ' ')\r\n    .toLowerCase()\r\n    .split(/[: /-]/);\r\n  const dt = strTokens.map(s => parseNumberOrNull(s) ?? Number.NaN);\r\n\r\n  let d: Date | null = null;\r\n\r\n  if (\r\n    format.startsWith('mm/dd/yy') ||\r\n    format.startsWith('mmm/dd/yy') ||\r\n    format.startsWith('mm-dd-yy') ||\r\n    format.startsWith('mmm-dd-yy')\r\n  ) {\r\n    // handle US format\r\n    return validDateOrNull(\r\n      correctYear(dt[2]),\r\n      parseMonth(strTokens[0]),\r\n      dt[1],\r\n      dt[3] || 0,\r\n      dt[4] || 0,\r\n      dt[5] || 0,\r\n      dt[6] || 0\r\n    );\r\n  } else if (format.startsWith('yyyymm')) {\r\n    return validDateOrNull(\r\n      parseInt(value.substring(0, 4)),\r\n      parseInt(value.substring(4, 6)) - 1,\r\n      value.length > 6 ? parseInt(value.substring(6, 8)) : 1,\r\n      0,\r\n      0,\r\n      0,\r\n      0\r\n    );\r\n  } else if (\r\n    format.startsWith('dd/mm/yy') ||\r\n    format.startsWith('dd/mmm/yy') ||\r\n    format.startsWith('dd-mm-yy') ||\r\n    format.startsWith('dd-mmm-yy')\r\n  ) {\r\n    return validDateOrNull(\r\n      correctYear(dt[2]),\r\n      parseMonth(strTokens[1]),\r\n      dt[0],\r\n      dt[3] || 0,\r\n      dt[4] || 0,\r\n      dt[5] || 0,\r\n      dt[6] || 0\r\n    );\r\n  } else if (format.startsWith('yyyy-mm')) {\r\n    return validDateOrNull(\r\n      dt[0],\r\n      parseMonth(strTokens[1]),\r\n      dt[2] || 1,\r\n      dt[3] || 0,\r\n      dt[4] || 0,\r\n      dt[5] || 0,\r\n      dt[6] || 0\r\n    );\r\n  } else if (format.length) {\r\n    throw new Error(`Unrecognized format '${format}'`);\r\n  }\r\n\r\n  // try ISO first\r\n  d = validDateOrNull(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, dt[6] || 0);\r\n  if (d) {\r\n    return d;\r\n  }\r\n\r\n  // then UK\r\n  d = validDateOrNull(\r\n    correctYear(dt[2]),\r\n    parseMonth(strTokens[1]),\r\n    dt[0],\r\n    dt[3] || 0,\r\n    dt[4] || 0,\r\n    dt[5] || 0,\r\n    dt[6] || 0\r\n  );\r\n  if (d) {\r\n    return d;\r\n  }\r\n\r\n  // we can't accept both UK and US format as it is ambiguous\r\n  // for US use format parameter e.g. MM/dd/yyyy\r\n  // // then US guess\r\n  // return validDateOrNull(\r\n  //   correctYear(dt[2]),\r\n  //   parseMonth(strTokens[0]),\r\n  //   dt[1],\r\n  //   dt[3] || 0,\r\n  //   dt[4] || 0,\r\n  //   dt[5] || 0,\r\n  //   dt[6] || 0\r\n  // );\r\n\r\n  return null;\r\n}\r\n\r\nexport function parseBooleanOrNull(val: boolean | string): boolean | null {\r\n  if (!val) {\r\n    return null;\r\n  }\r\n  if (typeof val === 'boolean') {\r\n    return val;\r\n  }\r\n\r\n  const trulyVals = ['1', 'yes', 'true', 'on'];\r\n  const falsyVals = ['0', 'no', 'false', 'off'];\r\n  const checkVal = val.toString().toLowerCase().trim();\r\n\r\n  if (trulyVals.includes(checkVal)) {\r\n    return true;\r\n  }\r\n\r\n  if (falsyVals.includes(checkVal)) {\r\n    return false;\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nexport function addDays(dt: Date, daysOffset: number): Date {\r\n  if (!dt || !(dt instanceof Date)) {\r\n    throw new Error('First parameter must be Date');\r\n  }\r\n  dt = new Date(dt.valueOf());\r\n  dt.setDate(dt.getDate() + daysOffset);\r\n  return dt;\r\n}\r\n\r\nexport function addBusinessDays(dt: Date, bDaysOffset: number, holidays?: (Date | string)[]): Date {\r\n  const date = parseDatetimeOrNull(dt);\r\n  const holidayDates =\r\n    holidays\r\n      ?.map(d => parseDatetimeOrNull(d))\r\n      ?.filter(d => !!d)\r\n      ?.map(d => d?.toDateString()) || [];\r\n  if (!date) {\r\n    throw new Error(`A first parameter to 'addBusinessdays' must be Date`);\r\n  }\r\n  dt = new Date(date.valueOf());\r\n  dt.setDate(dt.getDate() + bDaysOffset);\r\n\r\n  // skip saturdays and sundays\r\n  if (bDaysOffset < 0) {\r\n    while (dt.getDay() === 0 || dt.getDay() === 6 || holidayDates.includes(dt.toDateString())) {\r\n      dt.setDate(dt.getDate() - 1);\r\n    }\r\n  } else {\r\n    while (dt.getDay() === 0 || dt.getDay() === 6 || holidayDates.includes(dt.toDateString())) {\r\n      dt.setDate(dt.getDate() + 1);\r\n    }\r\n  }\r\n  return dt;\r\n}\r\n\r\nexport function dateToString(d: Date, format?: string): string {\r\n  if (!(d instanceof Date)) {\r\n    throw new Error(`A first parameter to 'dateToString' must be Date`);\r\n  }\r\n\r\n  const date = new Date(d.valueOf());\r\n  date.setMinutes(date.getMinutes() - date.getTimezoneOffset());\r\n  const strDate = date.toISOString().replace('T00:00:00.000Z', '');\r\n\r\n  if (format) {\r\n    // a quick and dirty way to achive a most used formats\r\n    const t = strDate.split(/[.T:Z /-]/);\r\n    const f = {\r\n      yyyy: t[0],\r\n      yy: t[0].slice(2),\r\n      mm: t[1],\r\n      dd: t[2]\r\n    };\r\n\r\n    if (format.toLowerCase() === 'dd/mm/yyyy') {\r\n      return `${f.dd}/${f.mm}/${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'mm/dd/yyyy') {\r\n      return `${f.mm}/${f.dd}/${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'dd/mm/yy') {\r\n      return `${f.dd}/${f.mm}/${f.yy}`;\r\n    } else if (format.toLowerCase() === 'yyyymmdd') {\r\n      return `${f.yyyy}${f.mm}${f.dd}`;\r\n    } else if (format.toLowerCase() === 'mm-dd-yyyy') {\r\n      return `${f.mm}-${f.dd}-${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'mm-dd-yy') {\r\n      return `${f.mm}-${f.dd}-${f.yy}`;\r\n    } else if (format.toLowerCase() === 'dd-mm-yyyy') {\r\n      return `${f.dd}-${f.mm}-${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'yyyy-mm-dd') {\r\n      return `${f.yyyy}-${f.mm}-${f.dd}`;\r\n    } else {\r\n      throw new Error(`Unsupported format ${format}`);\r\n    }\r\n  }\r\n\r\n  return strDate;\r\n}\r\n\r\nexport function deepClone(obj: any): any {\r\n  if (obj == null || obj == undefined) {\r\n    return obj;\r\n  }\r\n\r\n  if (obj instanceof Date) {\r\n    return new Date(obj.getTime());\r\n  }\r\n\r\n  if (Array.isArray(obj)) {\r\n    return obj.map(v => deepClone(v));\r\n  }\r\n\r\n  if (typeof obj === 'object') {\r\n    const clone = {} as any;\r\n    for (const propName in obj) {\r\n      const propValue = obj[propName];\r\n\r\n      if (propValue == null || propValue == undefined) {\r\n        clone[propName] = propValue;\r\n      } else if (propValue instanceof Date) {\r\n        clone[propName] = new Date(propValue.getTime());\r\n      } else if (Array.isArray(propValue)) {\r\n        clone[propName] = propValue.map(v => deepClone(v));\r\n      } else if (typeof propValue == 'object') {\r\n        clone[propName] = deepClone(propValue);\r\n      } else {\r\n        clone[propName] = propValue;\r\n      }\r\n    }\r\n    return clone;\r\n  }\r\n\r\n  return obj;\r\n}\r\n\r\nexport function workoutDataType(\r\n  value: ScalarType,\r\n  inType: DataTypeName | undefined\r\n): DataTypeName | undefined {\r\n  function getRealType(val: ScalarType): DataTypeName {\r\n    function processNumber(num: number): DataTypeName {\r\n      if (num % 1 === 0) {\r\n        return num > 2147483647 ? DataTypeName.BigIntNumber : DataTypeName.WholeNumber;\r\n      } else {\r\n        return DataTypeName.FloatNumber;\r\n      }\r\n    }\r\n\r\n    let num = null;\r\n    let bl = null;\r\n    let dt = null;\r\n\r\n    switch (typeof val) {\r\n      case 'boolean':\r\n        return DataTypeName.Boolean;\r\n      case 'number':\r\n        return processNumber(val);\r\n      case 'object':\r\n        if (val instanceof Date) {\r\n          const dt = val;\r\n          return dt.getHours() === 0 && dt.getMinutes() === 0 && dt.getSeconds() === 0\r\n            ? DataTypeName.Date\r\n            : DataTypeName.DateTime;\r\n        }\r\n\r\n        return DataTypeName.String;\r\n      case 'string':\r\n        dt = parseDatetimeOrNull(val);\r\n        if (dt) {\r\n          return dt.getHours() === 0 && dt.getMinutes() === 0 && dt.getSeconds() === 0\r\n            ? DataTypeName.Date\r\n            : DataTypeName.DateTime;\r\n        }\r\n\r\n        num = parseNumberOrNull(val);\r\n        if (num !== null) {\r\n          return processNumber(num);\r\n        }\r\n\r\n        bl = parseBooleanOrNull(val);\r\n        if (bl !== null) {\r\n          return DataTypeName.Boolean;\r\n        }\r\n\r\n        return val.length > 4000 ? DataTypeName.LargeString : DataTypeName.String;\r\n\r\n      default:\r\n        return DataTypeName.LargeString;\r\n    }\r\n  }\r\n\r\n  if (value == null || value == undefined) {\r\n    return undefined;\r\n  }\r\n\r\n  // no point to proceed, string is most common type\r\n  if (inType === DataTypeName.LargeString) {\r\n    return DataTypeName.LargeString;\r\n  }\r\n\r\n  const realType = getRealType(value);\r\n\r\n  if (inType === undefined) {\r\n    return realType;\r\n  } else {\r\n    // normal case. Means all values in column are the same\r\n    if (inType === realType) {\r\n      return inType;\r\n    }\r\n\r\n    // date / datetime case\r\n    if (\r\n      (inType === DataTypeName.Date && realType === DataTypeName.DateTime) ||\r\n      (inType === DataTypeName.DateTime && realType === DataTypeName.Date)\r\n    ) {\r\n      return DataTypeName.DateTime;\r\n    }\r\n\r\n    // if any of items are string, then it must be string\r\n    if (realType === DataTypeName.String) {\r\n      return DataTypeName.String;\r\n    }\r\n    if (inType === DataTypeName.String && realType !== DataTypeName.LargeString) {\r\n      return DataTypeName.String;\r\n    }\r\n\r\n    if (inType === DataTypeName.FloatNumber) {\r\n      return DataTypeName.FloatNumber;\r\n    }\r\n    if (realType === DataTypeName.FloatNumber && inType === DataTypeName.WholeNumber) {\r\n      return DataTypeName.FloatNumber;\r\n    }\r\n\r\n    if (realType === DataTypeName.BigIntNumber) {\r\n      return DataTypeName.BigIntNumber;\r\n    }\r\n    if (inType === DataTypeName.BigIntNumber && realType === DataTypeName.WholeNumber) {\r\n      return DataTypeName.BigIntNumber;\r\n    }\r\n\r\n    if (realType !== inType && realType !== DataTypeName.LargeString) {\r\n      return DataTypeName.String;\r\n    }\r\n\r\n    return DataTypeName.LargeString;\r\n  }\r\n\r\n  return undefined;\r\n}\r\n\r\n/**\r\n * generates a field descriptions (first level only) that can be used for relational table definition.\r\n * if any properties are Objects, it would use JSON.stringify to calculate maxSize field.\r\n * @param items\r\n */\r\nexport function getFieldsInfo(\r\n  items: Record<string, ScalarType>[] | ScalarType[]\r\n): FieldDescription[] {\r\n  const resultMap: Record<string, FieldDescription> = Object.create(null);\r\n  const valuesMap: Record<string, Set<string | null>> = Object.create(null);\r\n  let index = 0;\r\n\r\n  function processItem(\r\n    name: string,\r\n    value: string | number | bigint | boolean | Date | null\r\n  ): void {\r\n    let fDesc = resultMap[name];\r\n    let valuesSet = valuesMap[name];\r\n\r\n    if (valuesSet === undefined) {\r\n      valuesSet = valuesMap[name] = new Set<string>();\r\n    }\r\n\r\n    if (fDesc === undefined) {\r\n      fDesc = {\r\n        index: index++,\r\n        fieldName: name,\r\n        isNullable: false,\r\n        isObject: false\r\n      } as FieldDescription;\r\n      resultMap[name] = fDesc;\r\n    }\r\n\r\n    let strValue: PrimitiveType | null = null;\r\n    if (value === null || value === undefined) {\r\n      fDesc.isNullable = true;\r\n    } else {\r\n      strValue =\r\n        value instanceof Date\r\n          ? dateToString(value)\r\n          : typeof value === 'object'\r\n          ? JSON.stringify(value)\r\n          : String(value);\r\n\r\n      if (!fDesc.isObject && !(value instanceof Date)) {\r\n        fDesc.isObject = typeof value === 'object';\r\n      }\r\n\r\n      const newType = workoutDataType(value, fDesc.dataTypeName);\r\n\r\n      if (\r\n        newType !== fDesc.dataTypeName &&\r\n        // special case when datetime can't be date again\r\n        !(fDesc.dataTypeName === DataTypeName.DateTime && newType === DataTypeName.Date)\r\n      ) {\r\n        fDesc.dataTypeName = newType;\r\n      }\r\n\r\n      if (\r\n        (fDesc.dataTypeName == DataTypeName.String ||\r\n          fDesc.dataTypeName == DataTypeName.LargeString) &&\r\n        strValue.length > (fDesc.maxSize || 0)\r\n      ) {\r\n        fDesc.maxSize = strValue.length;\r\n      }\r\n    }\r\n\r\n    if (!valuesSet.has(strValue)) {\r\n      valuesSet.add(strValue);\r\n    }\r\n  }\r\n\r\n  for (let i = 0; i < items.length; i++) {\r\n    const item = items[i];\r\n    if (\r\n      item !== null &&\r\n      item !== undefined &&\r\n      typeof item === 'object' &&\r\n      !(item instanceof Date) &&\r\n      !Array.isArray(item)\r\n    ) {\r\n      for (const [name, value] of Object.entries(item as Record<string, ScalarType>)) {\r\n        processItem(name, value);\r\n      }\r\n    } else {\r\n      processItem('_value_', item as ScalarType);\r\n    }\r\n  }\r\n\r\n  const fields = Object.values(resultMap).sort((a: FieldDescription, b: FieldDescription) =>\r\n    a.index > b.index ? 1 : b.index > a.index ? -1 : 0\r\n  );\r\n\r\n  return fields.map(r => {\r\n    r.isUnique = valuesMap[r.fieldName].size === items.length;\r\n    return r;\r\n  });\r\n}\r\n\r\nexport function processJson(\r\n  jsonString: string,\r\n  handlePathFunc: (path: (string | number)[], row: number, col: number) => boolean\r\n): void {\r\n  if (typeof handlePathFunc !== 'function') {\r\n    throw new Error('handlePathFunc is not provided.');\r\n  }\r\n\r\n  function tokenize(\r\n    json: string,\r\n    tokenFunc: (token: string, row: number, column: number) => boolean\r\n  ): void {\r\n    let line = 1,\r\n      column = 0;\r\n\r\n    let isString = false;\r\n    let currentString = '';\r\n    let previousToken = '';\r\n\r\n    for (let i = 0; i < json.length; i++) {\r\n      column++;\r\n      const currChar = json[i];\r\n      if (currChar === '\\n') {\r\n        line++;\r\n        column = 0;\r\n        continue;\r\n      }\r\n\r\n      if (currChar === '\"' && json[i - 1] !== '\\\\') {\r\n        isString = !isString;\r\n        // skip string value and empty strings\r\n        if (currentString && previousToken !== ':') {\r\n          if (typeof tokenFunc === 'function' && tokenFunc(currentString, line, column)) {\r\n            break;\r\n          }\r\n          previousToken = currentString;\r\n        }\r\n        currentString = '';\r\n        continue;\r\n      }\r\n\r\n      if (isString) {\r\n        currentString += currChar;\r\n      } else if (['[', ']', ':', '{', '}', ','].indexOf(currChar) >= 0) {\r\n        if (typeof tokenFunc === 'function' && tokenFunc(currChar, line, column)) {\r\n          break;\r\n        }\r\n        previousToken = currentString;\r\n      }\r\n    }\r\n  }\r\n\r\n  const currentPath: (string | number)[] = [];\r\n  let isNextTokenAKey = false;\r\n\r\n  function handleToken(token: string, row: number, column: number): boolean {\r\n    const isArrayLevel: () => boolean = () =>\r\n      typeof currentPath[currentPath.length - 1] === 'number';\r\n\r\n    if (token === '{') {\r\n      if (isArrayLevel()) {\r\n        (currentPath[currentPath.length - 1] as number)++;\r\n        if (handlePathFunc([...currentPath], row, column)) {\r\n          return true;\r\n        }\r\n      }\r\n\r\n      isNextTokenAKey = true;\r\n\r\n      return false;\r\n    }\r\n    if (token === '}') {\r\n      if (!isNextTokenAKey) {\r\n        currentPath.pop();\r\n      }\r\n      isNextTokenAKey = false;\r\n      return false;\r\n    }\r\n\r\n    if (token === ',') {\r\n      if (!isArrayLevel()) {\r\n        isNextTokenAKey = true;\r\n        currentPath.pop();\r\n      }\r\n      return false;\r\n    }\r\n\r\n    if (token === '[') {\r\n      currentPath.push(-1);\r\n      return false;\r\n    }\r\n\r\n    if (token === ']') {\r\n      currentPath.pop();\r\n      return false;\r\n    }\r\n\r\n    if (isNextTokenAKey) {\r\n      isNextTokenAKey = false;\r\n      currentPath.push(token);\r\n      if (handlePathFunc([...currentPath], row, column)) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  tokenize(jsonString, handleToken);\r\n}\r\n","import { Selector } from './types';\r\nimport { dateToString } from './utils';\r\n\r\nexport function fieldSelector(\r\n  input: string | string[] | Selector<any, string>\r\n): Selector<any, string> {\r\n  if (typeof input === 'function') {\r\n    return input;\r\n  } else if (typeof input === 'string') {\r\n    return (item): any => (item[input] instanceof Date ? dateToString(item[input]) : item[input]);\r\n  } else if (Array.isArray(input)) {\r\n    return (item): any => input.map(r => item[r]).join('|');\r\n  } else {\r\n    throw Error(`Unknown input. Can't create a fieldSelector`);\r\n  }\r\n}\r\n","import { Selector } from '../types';\r\nimport { fieldSelector } from '../_internals';\r\n\r\nfunction verifyJoinArgs(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKeySelector: (item: any) => string,\r\n  rightKeySelector: (item: any) => string,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): void {\r\n  if (!leftArray || !Array.isArray(leftArray)) {\r\n    throw Error('leftArray is not provided or not a valid');\r\n  }\r\n  if (!rightArray || !Array.isArray(rightArray)) {\r\n    throw Error('rightArray is not provided or not a valid');\r\n  }\r\n\r\n  if (typeof leftKeySelector !== 'function') {\r\n    throw Error('leftKeySelector is not provided or not a valid function');\r\n  }\r\n\r\n  if (typeof rightKeySelector !== 'function') {\r\n    throw Error('rightKeySelector is not provided or not a valid function');\r\n  }\r\n\r\n  if (typeof resultSelector !== 'function') {\r\n    throw Error('resultSelector is not provided or not a valid function');\r\n  }\r\n}\r\n\r\nfunction leftOrInnerJoin(\r\n  isInnerJoin: boolean,\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKey: string | string[] | Selector<any, string>,\r\n  rightKey: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  const leftKeySelector = fieldSelector(leftKey);\r\n  const rightKeySelector = fieldSelector(rightKey);\r\n\r\n  verifyJoinArgs(leftArray, rightArray, leftKeySelector, rightKeySelector, resultSelector);\r\n\r\n  // build a lookup map\r\n  const rightArrayMap = Object.create(null);\r\n  for (const item of rightArray) {\r\n    rightArrayMap[rightKeySelector(item)] = item;\r\n  }\r\n\r\n  const result: any[] = [];\r\n  for (const leftItem of leftArray) {\r\n    const leftKey = leftKeySelector(leftItem);\r\n    const rightItem = rightArrayMap[leftKey] || null;\r\n\r\n    if (isInnerJoin && !rightItem) {\r\n      continue;\r\n    }\r\n\r\n    const resultItem = resultSelector(leftItem, rightItem);\r\n\r\n    // if result is null then probably a left item was modified\r\n    result.push(resultItem || leftItem);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * leftJoin returns all elements from the left array (leftArray), and the matched elements from the right array (rightArray).\r\n * The result is NULL from the right side, if there is no match.\r\n * @param leftArray array for left side in a join\r\n * @param rightArray array for right side in a join\r\n * @param leftKey A key from left side array. What can be as a fieldName, multiple fields or key Selector\r\n * @param rightKey A key from right side array. what can be as a fieldName, multiple fields or key Selector\r\n * @param resultSelector A callback function that returns result value\r\n */\r\nexport function leftJoin(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKeySelector: string | string[] | Selector<any, string>,\r\n  rightKeySelector: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  return leftOrInnerJoin(\r\n    false,\r\n    leftArray,\r\n    rightArray,\r\n    leftKeySelector,\r\n    rightKeySelector,\r\n    resultSelector\r\n  );\r\n}\r\n\r\n/**\r\n * innerJoin - Joins two arrays together by selecting elements that have matching values in both arrays.\r\n * If there are elements in any array that do not have matches in other array, these elements will not be shown!\r\n * @param leftArray array for left side in a join\r\n * @param rightArray array for right side in a join\r\n * @param leftKey A key from left side array. What can be as a fieldName, multiple fields or key Selector\r\n * @param rightKey A key from right side array. what can be as a fieldName, multiple fields or key Selector\r\n * @param resultSelector A callback function that returns result value\r\n */\r\nexport function innerJoin(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKey: string | string[] | Selector<any, string>,\r\n  rightKey: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  return leftOrInnerJoin(true, leftArray, rightArray, leftKey, rightKey, resultSelector);\r\n}\r\n\r\n/**\r\n * fullJoin returns all elements from the left array (leftArray), and all elements from the right array (rightArray).\r\n * The result is NULL from the right/left side, if there is no match.\r\n * @param leftArray array for left side in a join\r\n * @param rightArray array for right side in a join\r\n * @param leftKey A key from left side array. What can be as a fieldName, multiple fields or key Selector\r\n * @param rightKey A key from right side array. what can be as a fieldName, multiple fields or key Selector\r\n * @param resultSelector A callback function that returns result value\r\n */\r\nexport function fullJoin(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKey: string | string[] | Selector<any, string>,\r\n  rightKey: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  const leftKeySelector = fieldSelector(leftKey);\r\n  const rightKeySelector = fieldSelector(rightKey);\r\n\r\n  verifyJoinArgs(leftArray, rightArray, leftKeySelector, rightKeySelector, resultSelector);\r\n\r\n  // build a lookup maps for both arrays.\r\n  // so, both of them have to be unique, otherwise it will flattern result\r\n  const leftArrayMap = Object.create(null);\r\n  for (const item of rightArray) {\r\n    leftArrayMap[leftKeySelector(item)] = item;\r\n  }\r\n\r\n  const rightArrayMap = Object.create(null);\r\n  for (const item of rightArray) {\r\n    rightArrayMap[rightKeySelector(item)] = item;\r\n  }\r\n\r\n  const result: any[] = [];\r\n  for (const leftItem of leftArray) {\r\n    const leftKey = leftKeySelector(leftItem);\r\n    const rightItem = rightArrayMap[leftKey] || null;\r\n\r\n    const resultItem = resultSelector(leftItem, rightItem);\r\n\r\n    // if result is null then probably a left item was modified\r\n    result.push(resultItem || leftItem);\r\n    if (rightItem) {\r\n      delete rightArrayMap[leftKey];\r\n    }\r\n  }\r\n\r\n  // add remaining right items\r\n  for (const rightItemKey in rightArrayMap) {\r\n    const rightItem = rightArrayMap[rightItemKey];\r\n    const resultItem = resultSelector(null, rightItem);\r\n\r\n    // if result is null then probably a left item was modified\r\n    result.push(resultItem || rightItem);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * merges elements from two arrays. It appends source element or overrides to target array based on matching keys provided\r\n * @param targetArray target array\r\n * @param sourceArray source array\r\n * @param targetKey tartget key field, arry of fields or field serlector\r\n * @param sourceKey source key field, arry of fields or field serlector\r\n */\r\nexport function merge(\r\n  targetArray: any[],\r\n  sourceArray: any[],\r\n  targetKey: string | string[] | Selector<any, string>,\r\n  sourceKey: string | string[] | Selector<any, string>\r\n): any[] {\r\n  const targetKeySelector = fieldSelector(targetKey);\r\n  const sourceKeySelector = fieldSelector(sourceKey);\r\n  verifyJoinArgs(targetArray, sourceArray, targetKeySelector, sourceKeySelector, () => false);\r\n\r\n  // build a lookup maps for both arrays.\r\n  // so, both of them have to be unique, otherwise it will flattern result\r\n  const targetArrayMap = Object.create(null);\r\n  for (const item of sourceArray) {\r\n    targetArrayMap[targetKeySelector(item)] = item;\r\n  }\r\n\r\n  const sourceArrayMap = Object.create(null);\r\n  for (const item of sourceArray) {\r\n    sourceArrayMap[sourceKeySelector(item)] = item;\r\n  }\r\n\r\n  for (const sourceItemKey of Object.keys(sourceArrayMap)) {\r\n    const sourceItem = sourceArrayMap[sourceItemKey];\r\n    if (!targetArrayMap[sourceItemKey]) {\r\n      targetArray.push(sourceItem);\r\n    } else {\r\n      // merge properties in\r\n      Object.assign(targetArrayMap[sourceItemKey], sourceItem);\r\n    }\r\n  }\r\n\r\n  return targetArray;\r\n}\r\n","import { parseNumber, parseDatetimeOrNull, dateToString } from '../utils';\r\nimport { ScalarType, Selector } from '..';\r\nimport { fieldSelector } from '../_internals';\r\n\r\nfunction compareStrings(a: string, b: any): number {\r\n  return a.localeCompare(b);\r\n}\r\n\r\nfunction compareNumbers(a: number, b: any): number {\r\n  const bNumVal = parseNumber(b);\r\n  if (bNumVal === undefined) {\r\n    return 1;\r\n  }\r\n\r\n  return a - bNumVal;\r\n}\r\n\r\nfunction compareObjects(a: any, b: any): number {\r\n  const aDate = parseDatetimeOrNull(a);\r\n  const bDate = parseDatetimeOrNull(b);\r\n\r\n  if (!aDate && !bDate) {\r\n    return 0;\r\n  }\r\n\r\n  if (!aDate) {\r\n    return -1;\r\n  }\r\n\r\n  if (!bDate) {\r\n    return 1;\r\n  }\r\n\r\n  return aDate.getTime() - bDate.getTime();\r\n}\r\n\r\nfunction compare(a: any, b: any, { field, asc }: any): number {\r\n  const valA = a[field];\r\n  const valB = b[field];\r\n  const order = asc ? 1 : -1;\r\n\r\n  if (valA !== undefined && valB === undefined) {\r\n    return order;\r\n  }\r\n\r\n  switch (typeof valA) {\r\n    case 'number':\r\n      return order * compareNumbers(valA, valB);\r\n    case 'string':\r\n      return order * compareStrings(valA, valB);\r\n    case 'object':\r\n      return order * compareObjects(valA, valB);\r\n    case 'undefined':\r\n      return valB === undefined ? 0 : -1 * order;\r\n  }\r\n  return 0;\r\n}\r\n\r\nfunction comparator(sortFields: any[]): (a: any, b: any) => number {\r\n  if (sortFields.length) {\r\n    return (a: any, b: any): number => {\r\n      for (let i = 0, len = sortFields.length; i < len; i++) {\r\n        const res = compare(a, b, sortFields[i]);\r\n\r\n        if (res !== 0) {\r\n          return res;\r\n        }\r\n      }\r\n      return 0;\r\n    };\r\n  }\r\n\r\n  return (): number => 0;\r\n}\r\n\r\n/**\r\n * Checks if array is empty or null or array at all\r\n * @param array\r\n */\r\nexport function isArrayEmptyOrNull(array: any[]): boolean {\r\n  return !array || !Array.isArray(array) || !array.length;\r\n}\r\n\r\n/**\r\n * A simple sort array function with a convenient interface\r\n * @param array The array to process.\r\n * @param fields sorts order.\r\n * @public\r\n * @example\r\n * sort(array, 'name ASC', 'age DESC');\r\n */\r\nexport function sort(array: any[], ...fields: string[]): any[] {\r\n  if (!array || !Array.isArray(array)) {\r\n    throw Error('Array is not provided');\r\n  }\r\n\r\n  if (!fields?.length) {\r\n    // just a default sort\r\n    return array.sort();\r\n  }\r\n\r\n  const sortFields = fields.map(field => {\r\n    const asc = !field.endsWith(' DESC');\r\n    return {\r\n      asc,\r\n      field: field.replace(asc ? /\\sASC$/ : /\\sDESC$/, '')\r\n    };\r\n  });\r\n\r\n  array.sort(comparator(sortFields));\r\n  return array;\r\n}\r\n/**\r\n * Converts array of items to the object map. Where key selector can be defined.\r\n * @param array to be converted\r\n * @param keyField a selector or field name for a property name\r\n */\r\nexport function toObject(\r\n  array: any[],\r\n  keyField: string | string[] | Selector<any, string>\r\n): Record<string, any> {\r\n  const result = {} as Record<string, any>;\r\n\r\n  for (const item of array) {\r\n    let key = fieldSelector(keyField)(item);\r\n    if ((key as any) instanceof Date) {\r\n      key = dateToString(key as any);\r\n    }\r\n    result[key] = item;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Convert array of items to into series array or series record.\r\n * @param array Array to be converted\r\n * @param propertyName optional parameter to define a property to be unpacked.\r\n * If it is string the array with values will be returned, otherwise an object with a list of series map\r\n */\r\nexport function toSeries(\r\n  array: any[],\r\n  propertyName?: string | string[]\r\n): Record<string, ScalarType[]> | ScalarType[] {\r\n  if (!array?.length) {\r\n    return {};\r\n  }\r\n\r\n  // a single property\r\n  if (typeof propertyName == 'string') {\r\n    return array.map(r => (r[propertyName] === undefined ? null : r[propertyName]));\r\n  }\r\n\r\n  const seriesRecord: Record<string, ScalarType[]> = {};\r\n\r\n  const seriesNames =\r\n    Array.isArray(propertyName) && propertyName.length ? propertyName : Object.keys(array[0]);\r\n\r\n  for (let i = 0; i < array.length; i++) {\r\n    for (let j = 0; j < seriesNames.length; j++) {\r\n      const seriesName = seriesNames[j];\r\n      if (!seriesRecord[seriesName]) {\r\n        seriesRecord[seriesName] = [];\r\n      }\r\n      const value = array[i][seriesName];\r\n      seriesRecord[seriesName].push(value === undefined ? null : value);\r\n    }\r\n  }\r\n\r\n  return seriesRecord;\r\n}\r\n","import { Selector, Predicate } from '../types';\r\nimport { parseNumber } from '../utils';\r\nimport { isArrayEmptyOrNull } from './utils';\r\n\r\nfunction fieldSelector(field?: string | Selector): Selector {\r\n  if (!field) {\r\n    return (item: any): any => item;\r\n  }\r\n  return typeof field === 'function'\r\n    ? (field as Selector)\r\n    : (item: any): any => item[String(field)];\r\n}\r\n\r\nfunction fieldComparator(field?: string | Selector): (a: any, b: any) => number {\r\n  return (a: any, b: any): number => {\r\n    const aVal = parseNumber(a, fieldSelector(field));\r\n    const bVal = parseNumber(b, fieldSelector(field));\r\n\r\n    if (bVal === undefined) {\r\n      return 1;\r\n    }\r\n\r\n    if (aVal === undefined) {\r\n      return -1;\r\n    }\r\n\r\n    return aVal - bVal >= 0 ? 1 : -1;\r\n  };\r\n}\r\n\r\nfunction getNumberValuesArray(array: any[], field?: string | Selector): number[] {\r\n  const elementSelector = fieldSelector(field);\r\n  return array\r\n    .map(item => parseNumber(item, elementSelector))\r\n    .filter(v => v !== undefined) as number[];\r\n}\r\n\r\n/**\r\n * Sum of items in array.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n * @returns Sum of array.\r\n * @public\r\n * @example\r\n * sum([1, 2, 5]); // 8\r\n *\r\n * sum([{ val: 1 }, { val: 5 }], i => i.val); // 6\r\n */\r\nexport function sum(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const elementSelector = fieldSelector(field);\r\n\r\n  let sum = 0;\r\n  for (const item of array) {\r\n    const numberVal = parseNumber(item, elementSelector);\r\n    if (numberVal) {\r\n      sum += numberVal;\r\n    }\r\n  }\r\n\r\n  return sum;\r\n}\r\n\r\n/**\r\n * Average of array items.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n * @public\r\n * @example\r\n * avg([1, 5, 3]); // 3\r\n */\r\nexport function avg(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const elementSelector = fieldSelector(field);\r\n\r\n  const s = sum(array, elementSelector);\r\n\r\n  return s ? s / array.length : null;\r\n}\r\n\r\n/**\r\n * Computes the minimum value of array.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function min(array: any[], field?: Selector | string): number | Date | null {\r\n  const elementSelector = fieldSelector(field);\r\n  const numberArray = getNumberValuesArray(array, elementSelector);\r\n  if (isArrayEmptyOrNull(numberArray)) {\r\n    return null;\r\n  }\r\n  const min = Math.min(...numberArray);\r\n  const item = elementSelector ? elementSelector(array[0]) : array[0];\r\n  if (item instanceof Date) {\r\n    return new Date(min);\r\n  }\r\n  return min;\r\n}\r\n\r\n/**\r\n * Computes the maximum value of array.\r\n * @public\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function max(array: any[], field?: Selector | string): number | Date | null {\r\n  const elementSelector = fieldSelector(field);\r\n  const numberArray = getNumberValuesArray(array, elementSelector);\r\n  if (isArrayEmptyOrNull(numberArray)) {\r\n    return null;\r\n  }\r\n  const max = Math.max(...numberArray);\r\n  const item = elementSelector ? elementSelector(array[0]) : array[0];\r\n  if (item instanceof Date) {\r\n    return new Date(max);\r\n  }\r\n  return max;\r\n}\r\n\r\n/**\r\n * Count of elements in array.\r\n * @public\r\n * @param array The array to process.\r\n * @param predicate Predicate function invoked per iteration.\r\n */\r\nexport function count(array: any[], predicate?: Predicate): number | null {\r\n  if (!array || !Array.isArray(array)) return null;\r\n\r\n  if (!predicate || typeof predicate !== 'function') {\r\n    return array.length;\r\n  }\r\n  return array.filter(predicate).length;\r\n}\r\n\r\n/**\r\n * Gets first item in array satisfies predicate.\r\n * @param array The array to process.\r\n * @param predicate Predicate function invoked per iteration.\r\n */\r\nexport function first<T = any>(array: T[], predicate?: Predicate): T | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  if (!predicate) {\r\n    return array[0];\r\n  }\r\n  for (let i = 0; i < array.length; i++) {\r\n    if (predicate(array[i])) {\r\n      return array[i];\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Gets last item in array satisfies predicate.\r\n * @param array The array to process.\r\n * @param predicate Predicate function invoked per iteration.\r\n */\r\nexport function last<T = any>(array: T[], predicate?: Predicate): T | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  let lastIndex = array.length - 1;\r\n  if (!predicate) {\r\n    return array[lastIndex];\r\n  }\r\n\r\n  for (; lastIndex >= 0; lastIndex--) {\r\n    if (predicate(array[lastIndex])) {\r\n      return array[lastIndex];\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\n/**\r\n * Gets counts map of values returned by `elementSelector`.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function countBy(array: any[], elementSelector: Selector): Record<string, number> {\r\n  if (!array || !Array.isArray(array)) {\r\n    throw Error('No array provided');\r\n  }\r\n\r\n  const results: Record<string, number> = {};\r\n  const length = array.length;\r\n\r\n  for (let i = 0; i < length; i++) {\r\n    const item = array[i];\r\n    const group = elementSelector(item);\r\n    results[group] = results[group] || 0;\r\n    results[group]++;\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n/**\r\n * Get mean of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function mean(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  let res = 0;\r\n  for (let i = 0, c = 0, len = array.length; i < len; ++i) {\r\n    const val = parseNumber(array[i], fieldSelector(field));\r\n    if (typeof val === 'number') {\r\n      const delta = val - res;\r\n      res = res + delta / ++c;\r\n    }\r\n  }\r\n  return res;\r\n}\r\n\r\n/**\r\n * Get quantile of a sorted array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n * @param p quantile.\r\n */\r\nexport function quantile(array: any[], p: number, field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const len = (array.length - 1) * p + 1;\r\n  const l = Math.floor(len);\r\n  const elementSelector = fieldSelector(field);\r\n  const val = elementSelector ? elementSelector(array[l - 1]) : array[l - 1];\r\n  const e = len - l;\r\n  return e ? val + e * (array[l] - val) : val;\r\n}\r\n\r\n/**\r\n * Get sample variance of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function variance(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const elementSelector = fieldSelector(field);\r\n  if (!Array.isArray(array) || array.length < 2) {\r\n    return 0;\r\n  }\r\n  let mean = 0,\r\n    M2 = 0,\r\n    c = 0;\r\n  for (let i = 0; i < array.length; ++i) {\r\n    const val = parseNumber(array[i], elementSelector);\r\n    if (typeof val === 'number') {\r\n      const delta = val - mean;\r\n      mean = mean + delta / ++c;\r\n      M2 = M2 + delta * (val - mean);\r\n    }\r\n  }\r\n  M2 = M2 / (c - 1);\r\n  return M2;\r\n}\r\n\r\n/**\r\n * Get the sample standard deviation of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function stdev(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const varr = variance(array, field);\r\n\r\n  if (varr === null) {\r\n    return null;\r\n  }\r\n\r\n  return Math.sqrt(varr);\r\n}\r\n\r\n/**\r\n * Get median of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function median(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  array.sort(fieldComparator(field));\r\n  return quantile(getNumberValuesArray(array, field), 0.5);\r\n}\r\n","import { Selector, Predicate } from '../types';\r\nimport { fieldSelector } from '../_internals';\r\nimport { sum } from './stats';\r\n\r\n/**\r\n * Groups array items based on elementSelector function\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function groupBy(array: any[], groupByFields: string | string[] | Selector): any[] {\r\n  if (!Array.isArray(array)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!array.length) {\r\n    return array;\r\n  }\r\n\r\n  const groups: { [key: string]: any[] } = {};\r\n\r\n  const elementSelector = fieldSelector(groupByFields);\r\n\r\n  for (let i = 0; i < array.length; i++) {\r\n    const item = array[i];\r\n    const group = elementSelector(item);\r\n    groups[group] = groups[group] || [];\r\n    groups[group].push(item);\r\n  }\r\n\r\n  return Object.values(groups);\r\n}\r\n\r\n/**\r\n * Returns a distinct elements from array.\r\n * Optional parameter *elementSelector* will create new array based on a callback function,\r\n * then will eliminate dublicates\r\n * @param array\r\n * @param elementSelector\r\n * @returns\r\n */\r\nexport function distinct(array: any[], elementSelector?: Selector): any[] {\r\n  if (elementSelector) {\r\n    array = array.map(elementSelector);\r\n  }\r\n  return Array.from(new Set(array));\r\n}\r\n/**\r\n * Flatten Object or array of objects\r\n * Object \r\n * [{ a: 1, d:{d1: 22, d2: 33} }, { b: 2, d:{d1:221, d2:331} }]\r\n * will become\r\n * [{ a: 1, d.d1: 22, d.d2: 33 }, { b: 2, d.d1: 221, d.d2: 331 }]\r\n * @param data \r\n * @returns \r\n */\r\n\r\nexport function unflattenObject(data: any): any {\r\n\r\n\r\n  function setProperty(data: any, pName: string, value: any): any {\r\n    const pNames = pName.split('.')\r\n    let parent: any = data\r\n\r\n    for (let i = 0; i < pNames.length - 1; i++) {\r\n      if (pNames[i] in parent) {\r\n        parent = parent[pNames[i]]\r\n      } else {\r\n        parent[pNames[i]] = {}\r\n        parent = parent[pNames[i]]\r\n      }\r\n    }\r\n    parent[pNames[pNames.length - 1]] = value\r\n  }\r\n  \r\n  if (Array.isArray(data)) {\r\n    const arr = [];\r\n    for (let i = 0; i < data.length; i++) {\r\n      const obj = unflattenObject(data[i]);\r\n      arr.push(obj);\r\n    }\r\n    return arr;\r\n  } else {\r\n    const obj: any = {}\r\n    const keys = Object.keys(data);\r\n    for (let i = 0; i < keys.length; i++) {\r\n      setProperty(obj, keys[i], data[keys[i]])\r\n    }\r\n    return obj\r\n  }\r\n}\r\n\r\nexport function flattenObject(data: any): any {\r\n  if (!data || typeof data !== 'object') {\r\n    return data;\r\n  }\r\n\r\n  function iterate(rootData: any, obj: any, prefix: string): void {\r\n    const keys = Object.keys(rootData);\r\n\r\n    for (let i = 0; i < keys.length; i++) {\r\n      const pName = prefix ? `${prefix}.${keys[i]}` : keys[i];\r\n\r\n      const value = rootData[keys[i]];\r\n      if (\r\n        typeof value === 'object' &&\r\n        value !== null &&\r\n        value !== undefined &&\r\n        !(value instanceof Date)\r\n      ) {\r\n        iterate(value, obj, pName);\r\n      } else if (typeof value === 'function') {\r\n        continue;\r\n      } else {\r\n        obj[pName] = value;\r\n      }\r\n    }\r\n  }\r\n\r\n  if (Array.isArray(data)) {\r\n    const arr = [];\r\n    for (let i = 0; i < data.length; i++) {\r\n      const obj = flattenObject(data[i]);\r\n      arr.push(obj);\r\n    }\r\n    return arr;\r\n  } else {\r\n    const obj: any = {};\r\n\r\n    iterate(data, obj, '');\r\n\r\n    return obj;\r\n  }\r\n}\r\n\r\n/**\r\n * Flattens array.\r\n * @param array The array to flatten recursively.\r\n * @example\r\n * flatten([1, 4, [2, [5, 5, [9, 7]], 11], 0]); // length 9\r\n */\r\nexport function flatten(array: any[]): any[] {\r\n  if (!Array.isArray(array)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!array.length) {\r\n    return array;\r\n  }\r\n\r\n  let res: any = [];\r\n  const length = array.length;\r\n\r\n  for (let i = 0; i < length; i++) {\r\n    const value = array[i];\r\n    if (Array.isArray(value)) {\r\n      res = [...res, ...flatten(value)];\r\n    } else {\r\n      res.push(value);\r\n    }\r\n  }\r\n  return res;\r\n}\r\n\r\n/**\r\n * Returns a reshaped array based on unique column values.\r\n * @param array array to pivot\r\n * @param rowFields row fields (or index fields). It can be one or more field names\r\n * @param columnField a field which values will be used to create columns\r\n * @param dataField a dataField which will be aggrated with aggregate function and groupped by rows and columns\r\n * @param aggFunction an aggregation function. Default value is sum. data field will be aggregated by this function\r\n * @param columnValues an optional initial column values. Use it to define a set of columns/values you would expect\r\n */\r\nexport function pivot(\r\n  array: any,\r\n  rowFields: string | string[],\r\n  columnField: string,\r\n  dataField: string,\r\n  aggFunction?: (array: any[]) => any | null,\r\n  columnValues?: string[]\r\n): any[] {\r\n  if (!Array.isArray(array)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!array.length) {\r\n    return array;\r\n  }\r\n\r\n  const groups: { [key: string]: any[] } = Object.create(null);\r\n  columnValues = columnValues || [];\r\n  aggFunction = aggFunction || ((a: any[]): number | null => sum(a));\r\n\r\n  const elementSelector = fieldSelector(rowFields);\r\n\r\n  rowFields = Array.isArray(rowFields) ? rowFields : [rowFields];\r\n\r\n  // group by rows\r\n  for (let i = 0; i < array.length; i++) {\r\n    const item = array[i];\r\n    const group = elementSelector(item);\r\n    groups[group] = groups[group] || [];\r\n    groups[group].push(item);\r\n\r\n    // accumulate column values\r\n    const columnValue = item[columnField];\r\n    if (columnValues.indexOf(columnValue) < 0) {\r\n      columnValues.push(columnValue);\r\n    }\r\n  }\r\n\r\n  const result: any[] = [];\r\n  for (const groupName of Object.keys(groups)) {\r\n    const item = Object.create(null);\r\n    // row fields first\r\n    for (const rowField of rowFields) {\r\n      item[rowField] = groups[groupName][0][rowField];\r\n    }\r\n\r\n    // then aggregated data for each colum value\r\n    for (const columnValue of columnValues) {\r\n      const dataArray = groups[groupName]\r\n        .filter(r => r[columnField] === columnValue)\r\n        .map(r => r[dataField]);\r\n      item[columnValue] = aggFunction(dataArray);\r\n    }\r\n\r\n    result.push(item);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Transpose rows to columns in an array\r\n * @param data\r\n */\r\nexport function transpose(data: any[]): any[] {\r\n  if (!Array.isArray(data)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!data.length) {\r\n    return data;\r\n  }\r\n\r\n  return Object.keys(data[0]).map(key => {\r\n    const res: { [key: string]: any } = {};\r\n    data.forEach((item, i) => {\r\n      if (i === 0) {\r\n        res.fieldName = key;\r\n      }\r\n\r\n      res['row' + i] = item[key];\r\n    });\r\n    return res;\r\n  });\r\n}\r\n\r\n/**\r\n * Creates new array based on selector.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function select(data: any[], selector: string | string[] | Selector): any[] {\r\n  if (!Array.isArray(data)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!data.length) {\r\n    return data;\r\n  }\r\n  const elementSelector = fieldSelector(selector);\r\n  return data.map(elementSelector);\r\n}\r\n\r\n/**\r\n * Filters array based on predicate function.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function where(data: any[], predicate: Predicate): any[] {\r\n  if (!Array.isArray(data)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  return data.filter(predicate);\r\n}\r\n"],"names":["fieldSelector"],"mappings":"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"}