UNPKG

2.66 kBJavaScriptView Raw
1import { AsyncIterableX } from './asynciterablex';
2import { toArray } from './toarray';
3import { sorter as defaultSorter } from '../internal/sorter';
4export class OrderedAsyncIterableBaseX extends AsyncIterableX {
5 constructor(source) {
6 super();
7 this._source = source;
8 }
9 async *[Symbol.asyncIterator]() {
10 const array = await toArray(this._source);
11 const len = array.length;
12 const indices = new Array(len);
13 for (let i = 0, len = array.length; i < len; i++) {
14 indices[i] = i;
15 }
16 indices.sort(this._getSorter(array));
17 for (const index of indices) {
18 yield array[index];
19 }
20 }
21 thenBy(keySelector, comparer = defaultSorter) {
22 /* tslint:disable-next-line: no-use-before-declare */
23 return new OrderedAsyncIterableX(this._source, keySelector, comparer, false, this);
24 }
25 thenByDescending(keySelector, comparer = defaultSorter) {
26 /* tslint:disable-next-line: no-use-before-declare */
27 return new OrderedAsyncIterableX(this._source, keySelector, comparer, true, this);
28 }
29}
30export class OrderedAsyncIterableX extends OrderedAsyncIterableBaseX {
31 constructor(source, keySelector, comparer, descending, parent) {
32 super(source);
33 this._keySelector = keySelector;
34 this._comparer = comparer;
35 this._descending = descending;
36 this._parent = parent;
37 }
38 _getSorter(elements, next) {
39 const keys = elements.map(this._keySelector);
40 const comparer = this._comparer;
41 const parent = this._parent;
42 const descending = this._descending;
43 const sorter = (x, y) => {
44 const result = comparer(keys[x], keys[y]);
45 if (result === 0) {
46 return next ? next(x, y) : x - y;
47 }
48 return descending ? -result : result;
49 };
50 return parent ? parent._getSorter(elements, sorter) : sorter;
51 }
52}
53export function orderBy(source, keySelector, comparer = defaultSorter) {
54 return new OrderedAsyncIterableX(source, keySelector, comparer, false);
55}
56export function orderByDescending(source, keySelector, comparer = defaultSorter) {
57 return new OrderedAsyncIterableX(source, keySelector, comparer, true);
58}
59export function thenBy(source, keySelector, comparer = defaultSorter) {
60 return new OrderedAsyncIterableX(source._source, keySelector, comparer, false, source);
61}
62export function thenByDescending(source, keySelector, comparer = defaultSorter) {
63 return new OrderedAsyncIterableX(source._source, keySelector, comparer, true, source);
64}
65
66//# sourceMappingURL=orderby.mjs.map