1.0.2 • Published 10 months ago
@esfx/async-iter-ordered v1.0.2
@esfx/async-iter-ordered
A Symbol-based API for defining an ECMAScript AsyncIterable with an inherent order.
Overview
Installation
npm i @esfx/async-iter-ordered
Usage
import { AsyncOrderedIterable } from "@esfx/async-iter-ordered";
import { Comparer, Comparison } from "@esfx/equatable";
import { toArrayAsync } from "@esfx/async-iter-fn";
interface Book {
title: string;
isbn: string;
...
}
class BooksAsyncOrderedIterable implements AsyncOrderedIterable<Book> {
private _books: AsyncIterable<Book>;
private _orderBy: readonly { keySelector: (element: Book) => unknown, keyComparer: Comparer<unknown>, descending: boolean }[];
private constructor(books: AsyncIterable<Book>, orderBy: readonly { keySelector: (element: Book) => unknown, keyComparer: Comparer<unknown>, descending: boolean }[]) {
this._books = books;
this._orderBy = orderBy;
}
static orderBy<K>(books: AsyncIterable<Book>, keySelector: (element: T) => K, keyComparer: Comparison<K> | Comparer<K>, descending: boolean): AsyncOrderedIterable<T> {
if (typeof keyComparer === "function") keyComparer = Comparer.create(keyComparer);
return new BooksAsyncOrderedIterable(books, [{ keySelecor, keyComparer, descending }]);
}
[OrderedIterable.thenBy]<K>(keySelector: (element: T) => K, keyComparer: Comparison<K> | Comparer<K>, descending: boolean): AsyncOrderedIterable<T> {
if (typeof keyComparer === "function") keyComparer = Comparer.create(keyComparer);
return new BooksAsyncOrderedIterable(this._books, [...this._orderBy, { keySelecor, keyComparer, descending }]);
}
async * [Symbol.asyncIterator]() {
const books = await toArrayAsync(this._books);
books.sort((a, b) => {
for (const { keySelector, keyComparer, descending } of this._orderBy) {
const aKey = keySelector(a);
const bKey = keySelector(b);
const result = descending ? keyComparer.compare(bKey, aKey) : keyComparer.compare(aKey, bKey);
if (result !== 0) return result;
}
return 0;
});
yield* books.values();
}
}
API
You can read more about the API here.
1.1.0-alpha.202307260322
10 months ago
1.1.0-alpha.202302091715
1 year ago
1.1.0-alpha.202306051228
11 months ago
1.1.0-alpha.202306061406
11 months ago
1.1.0-alpha.202306080253
11 months ago
1.1.0-alpha.202302071935
1 year ago
1.1.0-alpha.202306061316
11 months ago
1.1.0-alpha.202305082104
1 year ago
1.1.0-alpha.202211221509
1 year ago
1.0.2
2 years ago
1.1.0-alpha.202210252139
2 years ago
1.0.0
2 years ago
1.0.0-dev.7
2 years ago
1.0.0-pre.42
2 years ago
1.0.0-dev.8
2 years ago
1.0.0-pre.41
2 years ago
1.0.0-dev.5
2 years ago
1.0.0-pre.44
2 years ago
1.0.0-dev.6
2 years ago
1.0.0-pre.43
2 years ago
1.0.0-dev.4
2 years ago
1.0.0-prenative.0
2 years ago
1.0.0-prenative.1
2 years ago
1.0.0-dev.0
2 years ago
1.0.0-pre.40
2 years ago
1.0.0-pre.31
2 years ago
1.0.0-pre.33
2 years ago
1.0.0-pre.32
2 years ago
1.0.0-pre.35
2 years ago
1.0.0-pre.34
2 years ago
1.0.0-pre.37
2 years ago
1.0.0-pre.36
2 years ago
1.0.0-pre.39
2 years ago
1.0.0-pre.38
2 years ago
1.1.0-alpha.202211291446
1 year ago
1.0.0-pre.23
3 years ago
1.0.0-pre.19
3 years ago
1.0.0-pre.17
3 years ago
1.0.0-pre.16
3 years ago