/
take.ts
37 lines (35 loc) 路 1.07 KB
/
take.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import type { ReadOnlyIterable } from "@lou.codes/types";
import { createIterableIterator } from "./createIterableIterator.js";
/**
* Take the given amount of items from the iterable.
*
* @category Generators
* @example
* ```typescript
* const take2 = take(2);
* take2([1, 2, 3, 4, 5]); // [1, 2]
* ```
* @param amount Amount of items to take.
* @returns Curried function with `amount` in context.
*/
export const take =
(amount: bigint | number) =>
<Item>(iterable: ReadOnlyIterable<Item>) =>
createIterableIterator(function* () {
// eslint-disable-next-line functional/no-let
let count = 0n;
// eslint-disable-next-line functional/no-conditional-statements
if (amount > 0) {
// eslint-disable-next-line functional/no-loop-statements
for (const item of iterable) {
// eslint-disable-next-line @typescript-eslint/no-unused-expressions, functional/no-conditional-statements
if (count < amount) {
yield item;
// eslint-disable-next-line functional/no-expression-statements
count += 1n;
} else {
break;
}
}
}
});