Skip to content

Commit 927a20e

Browse files
🚧 progress: Import existing sources and tests from js-itertools.
1 parent 0c071d1 commit 927a20e

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/reversed.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* Yields elements of the input iterable in reverse order.
3+
*
4+
* @param {Iterable} iterable - The input iterable.
5+
* @returns {Iterator} - The input iterable, reversed.
6+
*/
7+
export default function* reversed(iterable) {
8+
const buffer = [];
9+
10+
for (const item of iterable) {
11+
buffer.push(item);
12+
}
13+
14+
// Caching length is believed to be faster
15+
16+
let jz = buffer.length;
17+
18+
for (; jz; --jz) {
19+
yield buffer.pop();
20+
}
21+
}

test/src/reversed.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import test from 'ava';
2+
3+
import {list, reversed} from '../../../src/index.js';
4+
5+
test('reversed', (t) => {
6+
const x = function (A, B) {
7+
t.deepEqual(list(reversed(A)), B);
8+
t.deepEqual(list(reversed(B)), A);
9+
};
10+
11+
x([], []);
12+
x([1], [1]);
13+
x([1, 2, 3], [3, 2, 1]);
14+
x([1, 2, 3, 4, 5, 6], [6, 5, 4, 3, 2, 1]);
15+
x([1, 2, 3, 4, 5, 6, 7, 8, 9], [9, 8, 7, 6, 5, 4, 3, 2, 1]);
16+
});

0 commit comments

Comments
 (0)