1 | import { AsyncIterableX } from './asynciterablex';
|
2 | import { toArray } from './toarray';
|
3 | import { sorter as defaultSorter } from '../internal/sorter';
|
4 | export 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 |
|
23 | return new OrderedAsyncIterableX(this._source, keySelector, comparer, false, this);
|
24 | }
|
25 | thenByDescending(keySelector, comparer = defaultSorter) {
|
26 |
|
27 | return new OrderedAsyncIterableX(this._source, keySelector, comparer, true, this);
|
28 | }
|
29 | }
|
30 | export 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 | }
|
53 | export function orderBy(source, keySelector, comparer = defaultSorter) {
|
54 | return new OrderedAsyncIterableX(source, keySelector, comparer, false);
|
55 | }
|
56 | export function orderByDescending(source, keySelector, comparer = defaultSorter) {
|
57 | return new OrderedAsyncIterableX(source, keySelector, comparer, true);
|
58 | }
|
59 | export function thenBy(source, keySelector, comparer = defaultSorter) {
|
60 | return new OrderedAsyncIterableX(source._source, keySelector, comparer, false, source);
|
61 | }
|
62 | export function thenByDescending(source, keySelector, comparer = defaultSorter) {
|
63 | return new OrderedAsyncIterableX(source._source, keySelector, comparer, true, source);
|
64 | }
|
65 |
|
66 |
|