{"version":3,"sources":["asynciterable/operators/orderby.ts"],"names":[],"mappings":"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","file":"orderby.js","sourcesContent":["import { AsyncIterableX } from '../asynciterablex';\nimport { toArray } from '../toarray';\nimport { sorter as defaultSorter } from '../../util/sorter';\nimport { UnaryFunction } from '../../interfaces';\n\nexport abstract class OrderedAsyncIterableBaseX<TSource> extends AsyncIterableX<TSource> {\n  _source: AsyncIterable<TSource>;\n\n  constructor(source: AsyncIterable<TSource>) {\n    super();\n    this._source = source;\n  }\n\n  async *[Symbol.asyncIterator]() {\n    const array = await toArray(this._source);\n    const len = array.length;\n    const indices = new Array<number>(len);\n    for (let i = 0; i < len; i++) {\n      indices[i] = i;\n    }\n\n    indices.sort(this._getSorter(array));\n    for (const index of indices) {\n      yield array[index];\n    }\n  }\n\n  thenBy<TKey>(\n    keySelector: (item: TSource) => TKey,\n    comparer: (fst: TKey, snd: TKey) => number = defaultSorter\n  ): OrderedAsyncIterableBaseX<TSource> {\n    return new OrderedAsyncIterableX<TKey, TSource>(\n      this._source,\n      keySelector,\n      comparer,\n      false,\n      this\n    );\n  }\n\n  thenByDescending<TKey>(\n    keySelector: (item: TSource) => TKey,\n    comparer: (fst: TKey, snd: TKey) => number = defaultSorter\n  ): OrderedAsyncIterableBaseX<TSource> {\n    return new OrderedAsyncIterableX<TKey, TSource>(\n      this._source,\n      keySelector,\n      comparer,\n      true,\n      this\n    );\n  }\n\n  abstract _getSorter(\n    elements: TSource[],\n    next?: (x: number, y: number) => number\n  ): (x: number, y: number) => number;\n}\n\nexport class OrderedAsyncIterableX<TKey, TSource> extends OrderedAsyncIterableBaseX<TSource> {\n  private _keySelector: (item: TSource) => TKey;\n  private _comparer: (fst: TKey, snd: TKey) => number;\n  private _descending: boolean;\n  private _parent?: OrderedAsyncIterableBaseX<TSource>;\n\n  constructor(\n    source: AsyncIterable<TSource>,\n    keySelector: (item: TSource) => TKey,\n    comparer: (fst: TKey, snd: TKey) => number,\n    descending: boolean,\n    parent?: OrderedAsyncIterableBaseX<TSource>\n  ) {\n    super(source);\n    this._keySelector = keySelector;\n    this._comparer = comparer;\n    this._descending = descending;\n    this._parent = parent;\n  }\n\n  _getSorter(\n    elements: TSource[],\n    next?: (x: number, y: number) => number\n  ): (x: number, y: number) => number {\n    const keys = elements.map(this._keySelector);\n    const comparer = this._comparer;\n    const parent = this._parent;\n    const descending = this._descending;\n    const sorter = (x: number, y: number): number => {\n      const result = comparer(keys[x], keys[y]);\n      if (result === 0) {\n        return next ? next(x, y) : x - y;\n      }\n\n      return descending ? -result : result;\n    };\n\n    return parent ? parent._getSorter(elements, sorter) : sorter;\n  }\n}\n\nexport function orderBy<TKey, TSource>(\n  keySelector: (item: TSource) => TKey,\n  comparer: (fst: TKey, snd: TKey) => number = defaultSorter\n): UnaryFunction<AsyncIterable<TSource>, OrderedAsyncIterableX<TKey, TSource>> {\n  return function orderByOperatorFunction(source: AsyncIterable<TSource>) {\n    return new OrderedAsyncIterableX<TKey, TSource>(source, keySelector, comparer, false);\n  };\n}\n\nexport function orderByDescending<TKey, TSource>(\n  keySelector: (item: TSource) => TKey,\n  comparer: (fst: TKey, snd: TKey) => number = defaultSorter\n): UnaryFunction<AsyncIterable<TSource>, OrderedAsyncIterableX<TKey, TSource>> {\n  return function orderByDescendingOperatorFunction(source: AsyncIterable<TSource>) {\n    return new OrderedAsyncIterableX<TKey, TSource>(source, keySelector, comparer, true);\n  };\n}\n\nexport function thenBy<TKey, TSource>(\n  keySelector: (item: TSource) => TKey,\n  comparer: (fst: TKey, snd: TKey) => number = defaultSorter\n): UnaryFunction<AsyncIterable<TSource>, OrderedAsyncIterableX<TKey, TSource>> {\n  return function thenByOperatorFunction(source: AsyncIterable<TSource>) {\n    const orderSource = <OrderedAsyncIterableBaseX<TSource>>source;\n    return new OrderedAsyncIterableX<TKey, TSource>(\n      orderSource._source,\n      keySelector,\n      comparer,\n      false,\n      orderSource\n    );\n  };\n}\n\nexport function thenByDescending<TKey, TSource>(\n  keySelector: (item: TSource) => TKey,\n  comparer: (fst: TKey, snd: TKey) => number = defaultSorter\n): UnaryFunction<AsyncIterable<TSource>, OrderedAsyncIterableX<TKey, TSource>> {\n  return function thenByDescendingOperatorFunction(source: AsyncIterable<TSource>) {\n    const orderSource = <OrderedAsyncIterableBaseX<TSource>>source;\n    return new OrderedAsyncIterableX<TKey, TSource>(\n      orderSource._source,\n      keySelector,\n      comparer,\n      true,\n      orderSource\n    );\n  };\n}\n"]}