{"version":3,"sources":["../src/utils/arrayHelpers.ts"],"sourcesContent":["import { OneOrMore } from \"./typeHelpers\"\n\nexport function hasAny<T>(ary: T[]): ary is [T, ...T[]]\nexport function hasAny<T>(ary: readonly T[]): ary is readonly [T, ...T[]]\nexport function hasAny<T>(ary: readonly T[]): ary is readonly [T, ...T[]] {\n  return ary.length > 0\n}\n\nexport function hasLength<T>(input: readonly T[], length: 0): input is []\nexport function hasLength<T>(input: readonly T[], length: 1): input is [T]\nexport function hasLength<T>(input: readonly T[], length: 2): input is [T, T]\nexport function hasLength<T>(input: readonly T[], length: 3): input is [T, T, T]\nexport function hasLength<T>(\n  input: readonly T[],\n  length: 4,\n): input is [T, T, T, T]\nexport function hasLength<T>(\n  input: readonly T[],\n  length: 5,\n): input is [T, T, T, T, T]\nexport function hasLength<T>(\n  input: readonly T[],\n  length: number,\n): input is OneOrMore<T> {\n  return input.length === length\n}\n\nexport function first<T>(ary: readonly [T, ...T[]]): T\nexport function first<T>(ary: readonly [...T[], T]): T\nexport function first<T>(ary: readonly T[]): undefined | T\nexport function first<T>(ary: readonly T[]): undefined | T {\n  return ary[0]\n}\n\nexport function last<T>(ary: readonly [T, ...T[]]): T\nexport function last<T>(ary: readonly [...T[], T]): T\nexport function last<T>(ary: readonly T[]): undefined | T\nexport function last<T>(ary: readonly T[]): undefined | T {\n  return ary[ary.length - 1]\n}\n\nconst _concat = [].concat\nexport function concat<Ts extends any[]>(\n  ...inputArrays: Ts[]\n): Ts[number] extends (infer U)[] ? U[] : never {\n  return _concat.apply([], inputArrays as any) as any\n}\n\nconst _reduce = [].reduce\nexport function reduce<Ts extends readonly any[], U>(\n  fn: (acc: U, item: Ts[number], index: number, items: Ts) => U,\n  initialValue: U,\n  inputArray: Ts,\n): U {\n  return _reduce.call(inputArray, fn as any, initialValue) as any\n}\n\nexport function range(start: number, end: number): number[] {\n  return Array.from({ length: end - start }, (_, i) => i + start)\n}\n\nexport function reverse<T>(ary: T[]): T[] {\n  const newAry = [...ary]\n  newAry.reverse()\n  return newAry\n}\n\nexport function uniq<T>(\n  ary: T[],\n  iteratee: (item: T) => any = item => item,\n): T[] {\n  const seen = new Set<any>()\n  return ary.filter(item => {\n    const key = iteratee(item)\n    if (seen.has(key)) {\n      return false\n    }\n    seen.add(key)\n    return true\n  })\n}\n\nexport function oneOf<T extends string[]>(\n  ...coll: T\n): (input: unknown) => input is T[number]\nexport function oneOf<T extends any[]>(\n  ...coll: T\n): (input: unknown) => input is T[number]\nexport function oneOf<T extends any[]>(\n  ...coll: T\n): (input: unknown) => input is T[number] {\n  return ((input: unknown) => coll.includes(input)) as any\n}\n\nexport type SortByIteratee<T> = (\n  item: T,\n  index: number,\n  ary: T[],\n) => number | bigint\n/**\n * https://github.com/jashkenas/underscore/blob/1abc36c169947c54c97e266513b1d763d0198f46/modules/sortBy.js\n */\nexport function sortBy<T>(\n  iteratee: SortByIteratee<T> | SortByIteratee<T>[],\n  ary: T[],\n): T[] {\n  const _iteratee = Array.isArray(iteratee) ? iteratee : [iteratee]\n\n  return ary\n    .map((value, index, ary) => ({\n      value: value,\n      index: index,\n      criteria: _iteratee.map(f => f(value, index, ary)),\n    }))\n    .sort((left, right) => compareMultiple(left, right))\n    .map(v => v.value)\n}\ninterface CompareMultipleItem<T> {\n  value: T\n  index: number\n  criteria: (number | bigint)[]\n}\n/**\n * https://github.com/lodash/lodash/blob/4.17.15/lodash.js#L4632-L4657\n */\nfunction compareMultiple<T>(\n  obj: CompareMultipleItem<T>,\n  oth: CompareMultipleItem<T>,\n): number {\n  const objCriteria = obj.criteria\n  const othCriteria = oth.criteria\n  const length = objCriteria.length\n\n  let index = -1\n  while (++index < length) {\n    const objCri = objCriteria[index]\n    const othCri = othCriteria[index]\n\n    let result = 0\n    if (typeof objCri === typeof othCri) {\n      result = Number((objCri as bigint) - (othCri as bigint))\n    } else {\n      result = Number(objCri) - Number(othCri)\n    }\n    if (result) return result\n  }\n\n  return obj.index - oth.index\n}\n\nexport interface CurriedMapFindFn {\n  <T, U>(fn: (input: T) => U | undefined, input: readonly T[]): U | undefined\n  <T, U>(\n    fn: (input: T) => U | undefined,\n  ): (input: readonly T[]) => U | undefined\n}\nexport const mapFind: CurriedMapFindFn = (<T, U>(\n  fn: (input: T) => U | undefined,\n  input: readonly T[],\n): U | undefined => {\n  for (const item of input) {\n    const result = fn(item)\n    if (result != null) {\n      return result\n    }\n  }\n  return undefined\n}) as any\n\nexport interface CurriedMapFindPFn {\n  <T, U>(\n    fn: (input: T) => Promise<U | undefined> | U | undefined,\n    input: readonly T[],\n  ): Promise<U | undefined>\n  <T, U>(\n    fn: (input: T) => Promise<U | undefined> | U | undefined,\n  ): (input: readonly T[]) => Promise<U | undefined>\n}\nexport const mapFindP: CurriedMapFindPFn = (async <T, U>(\n  fn: (input: T) => Promise<U | undefined> | U | undefined,\n  input: readonly T[],\n): Promise<U | undefined> => {\n  for (const item of input) {\n    const result = await fn(item)\n    if (result != null) {\n      return result\n    }\n  }\n  return undefined\n}) as any\n"],"mappings":";AAIO,SAAS,OAAU,KAAgD;AACxE,SAAO,IAAI,SAAS;AACtB;AAcO,SAAS,UACd,OACA,QACuB;AACvB,SAAO,MAAM,WAAW;AAC1B;AAKO,SAAS,MAAS,KAAkC;AACzD,SAAO,IAAI,CAAC;AACd;AAKO,SAAS,KAAQ,KAAkC;AACxD,SAAO,IAAI,IAAI,SAAS,CAAC;AAC3B;AAEA,IAAM,UAAU,CAAC,EAAE;AACZ,SAAS,UACX,aAC2C;AAC9C,SAAO,QAAQ,MAAM,CAAC,GAAG,WAAkB;AAC7C;AAEA,IAAM,UAAU,CAAC,EAAE;AACZ,SAAS,OACd,IACA,cACA,YACG;AACH,SAAO,QAAQ,KAAK,YAAY,IAAW,YAAY;AACzD;AAEO,SAAS,MAAM,OAAe,KAAuB;AAC1D,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK;AAChE;AAEO,SAAS,QAAW,KAAe;AACxC,QAAM,SAAS,CAAC,GAAG,GAAG;AACtB,SAAO,QAAQ;AACf,SAAO;AACT;AAEO,SAAS,KACd,KACA,WAA6B,UAAQ,MAChC;AACL,QAAM,OAAO,oBAAI,IAAS;AAC1B,SAAO,IAAI,OAAO,UAAQ;AACxB,UAAM,MAAM,SAAS,IAAI;AACzB,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;AAQO,SAAS,SACX,MACqC;AACxC,SAAQ,CAAC,UAAmB,KAAK,SAAS,KAAK;AACjD;AAUO,SAAS,OACd,UACA,KACK;AACL,QAAM,YAAY,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAEhE,SAAO,IACJ,IAAI,CAAC,OAAO,OAAOA,UAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,UAAU,UAAU,IAAI,OAAK,EAAE,OAAO,OAAOA,IAAG,CAAC;AAAA,EACnD,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,gBAAgB,MAAM,KAAK,CAAC,EAClD,IAAI,OAAK,EAAE,KAAK;AACrB;AASA,SAAS,gBACP,KACA,KACQ;AACR,QAAM,cAAc,IAAI;AACxB,QAAM,cAAc,IAAI;AACxB,QAAM,SAAS,YAAY;AAE3B,MAAI,QAAQ;AACZ,SAAO,EAAE,QAAQ,QAAQ;AACvB,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,SAAS,YAAY,KAAK;AAEhC,QAAI,SAAS;AACb,QAAI,OAAO,WAAW,OAAO,QAAQ;AACnC,eAAS,OAAQ,SAAqB,MAAiB;AAAA,IACzD,OAAO;AACL,eAAS,OAAO,MAAM,IAAI,OAAO,MAAM;AAAA,IACzC;AACA,QAAI,OAAQ,QAAO;AAAA,EACrB;AAEA,SAAO,IAAI,QAAQ,IAAI;AACzB;AAQO,IAAM,UAA6B,CACxC,IACA,UACkB;AAClB,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,GAAG,IAAI;AACtB,QAAI,UAAU,MAAM;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAWO,IAAM,WAA+B,OAC1C,IACA,UAC2B;AAC3B,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,MAAM,GAAG,IAAI;AAC5B,QAAI,UAAU,MAAM;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":["ary"]}