Skip to content

Commit 17acfff

Browse files
✨ feat: Add method reversed().
Fixes #107.
1 parent a1f9ae6 commit 17acfff

File tree

9 files changed

+67
-4
lines changed

9 files changed

+67
-4
lines changed

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ Parent is [@aureooms/js-persistent](https://github.com/aureooms/js-persistent).
6060
* [`Tree#takeUntil(Function) -> Tree`](#treetakeuntilfunction---tree)
6161
* [`Tree#dropUntil(Function) -> Tree`](#treedropuntilfunction---tree)
6262
* [:flying_saucer: Visit](#flying_saucer-visit)
63-
* [`TreeSymbol.iterator -> Iterable`](#treesymboliterator---iterable)
63+
* [`Tree[Symbol.iterator]() -> Iterable`](#treesymboliterator---iterable)
64+
* [`Tree#reversed() -> Iterable`](#treereversed---iterable)
6465
* [:scroll: References](#scroll-references)
6566
* [:link: Links](#link-links)
6667

@@ -306,6 +307,14 @@ Returns an iterator on the values of the tree in left-to-right order.
306307
for ( const x of tree ) console.log( x ) ;
307308
```
308309

310+
#### `Tree#reversed() -> Iterable`
311+
312+
Returns an iterator on the values of the tree in right-to-left order.
313+
314+
```js
315+
for ( const x of tree.reversed() ) console.log( x ) ;
316+
```
317+
309318

310319
## :scroll: References
311320

src/1-digit/0-Digit.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ Digit.prototype._nodes_with_list = function (M, list, other) {
1313
Digit.prototype[Symbol.iterator] = function () {
1414
return this._list()[Symbol.iterator]();
1515
};
16+
17+
Digit.prototype.reversed = function () {
18+
return this._list().reverse()[Symbol.iterator]();
19+
};

src/2-node/2-Node2.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ Node2.prototype[Symbol.iterator] = function () {
1010
return [this.a, this.b][Symbol.iterator]();
1111
};
1212

13+
Node2.prototype.reversed = function () {
14+
return [this.b, this.a][Symbol.iterator]();
15+
};
16+
1317
Node2.prototype.measure = function () {
1418
return this.v;
1519
};

src/2-node/3-Node3.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ Node3.prototype[Symbol.iterator] = function () {
1111
return [this.a, this.b, this.c][Symbol.iterator]();
1212
};
1313

14+
Node3.prototype.reversed = function () {
15+
return [this.c, this.b, this.a][Symbol.iterator]();
16+
};
17+
1418
Node3.prototype.measure = function () {
1519
return this.v;
1620
};

src/3-tree/implementations/0-Empty.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Empty.prototype[Symbol.iterator] = function () {
4949
return _EMPTY;
5050
};
5151

52+
Empty.prototype.reversed = function* () {};
53+
5254
/**
5355
* It is assumed that p(i+|this|) is true.
5456
*/

src/3-tree/implementations/1-Single.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@ Single.prototype.concat = function (other) {
5757
return other.cons(this.a);
5858
};
5959

60-
Single.prototype[Symbol.iterator] = function* () {
61-
yield this.a;
62-
};
60+
Single.prototype[Symbol.iterator] =
61+
// eslint-disable-next-line no-multi-assign
62+
Single.prototype.reversed = function* () {
63+
yield this.a;
64+
};
6365

6466
/**
6567
* It is assumed that p(i+|this|) is true.

src/3-tree/implementations/2-Deep.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ Deep.prototype[Symbol.iterator] = function* () {
120120
yield* this.right;
121121
};
122122

123+
Deep.prototype.reversed = function* () {
124+
yield* this.right.reversed();
125+
for (const node of this.middle.reversed()) yield* node.reversed();
126+
yield* this.left.reversed();
127+
};
128+
123129
/**
124130
* It is assumed that p(i+|this|) is true.
125131
*/

src/4-lazy/0-Lazy.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,7 @@ Lazy.prototype.concat = function (other) {
6363
Lazy.prototype[Symbol.iterator] = function () {
6464
return this.force()[Symbol.iterator]();
6565
};
66+
67+
Lazy.prototype.reversed = function () {
68+
return this.force().reversed();
69+
};

test/src/methods/reversed.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import test from 'ava';
2+
3+
import {Measures} from '@aureooms/js-measure';
4+
const {COUNTER} = Measures;
5+
6+
import {list, range, tee, reversed} from '@aureooms/js-itertools';
7+
8+
import {from} from '../../../src/index.js';
9+
10+
const macro = (t, iterable) => {
11+
const [copy1, copy2] = tee(iterable, 2);
12+
const expected = list(reversed(copy1));
13+
const actual = list(from(COUNTER, copy2).reversed());
14+
t.deepEqual(actual, expected);
15+
};
16+
17+
macro.title = (title, iterable) =>
18+
`from(COUNTER, ${title || JSON.stringify(iterable)})`;
19+
20+
test(macro, []);
21+
test('range(0)', macro, range(0));
22+
test(macro, [0]);
23+
test(macro, 'ab');
24+
test(macro, '724');
25+
test(macro, 'abcd');
26+
test('range(9)', macro, range(9));
27+
test('range(1000)', macro, range(1000));
28+
test('range(100000)', macro, range(100000));

0 commit comments

Comments
 (0)