Skip to content

Commit 916d451

Browse files
✨ feat: Add insertAfter.
1 parent 7b49232 commit 916d451

File tree

7 files changed

+52
-9
lines changed

7 files changed

+52
-9
lines changed

src/Node.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
* Node.
33
*
44
* @param {any} value
5+
* @param {Node} next
56
*/
6-
export default function Node(value) {
7+
export default function Node(value, next) {
78
this._value = value;
8-
this._next = null;
9+
this._next = next;
910
}

src/_insertAfter.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import assert from 'assert';
2+
3+
// eslint-disable-next-line no-unused-vars
4+
import Node from './Node.js';
5+
import isNonEmpty from './isNonEmpty.js';
6+
import unshift from './unshift.js';
7+
import _setNext from './_setNext.js';
8+
import _shift from './_shift.js';
9+
10+
/**
11+
* Inserts value just after input node (cannot be null).
12+
*
13+
* @param {Node} x Input node (cannot be null).
14+
* @param {any} value
15+
*/
16+
export default function _insertAfter(x, value) {
17+
assert(isNonEmpty(x));
18+
_setNext(x, unshift(_shift(x), value));
19+
}

src/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export {default as Node} from './Node.js';
2+
export {default as _insertAfter} from './_insertAfter.js';
23
export {default as _isLast} from './_isLast.js';
34
export {default as _iter} from './_iter.js';
45
export {default as _iter_fast} from './_iter_fast.js';
@@ -12,6 +13,7 @@ export {default as _value} from './_value.js';
1213
export {default as concat} from './concat.js';
1314
export {default as empty} from './empty.js';
1415
export {default as from} from './from.js';
16+
export {default as insertAfter} from './insertAfter.js';
1517
export {default as isEmpty} from './isEmpty.js';
1618
export {default as isLast} from './isLast.js';
1719
export {default as isList} from './isList.js';

src/insertAfter.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import assert from 'assert';
2+
3+
// eslint-disable-next-line no-unused-vars
4+
import Node from './Node.js';
5+
import isNonEmpty from './isNonEmpty.js';
6+
import isEmpty from './isEmpty.js';
7+
import _insertAfter from './_insertAfter.js';
8+
9+
/**
10+
* Inserts value just after input node. Throws if input list is empty
11+
*
12+
* @param {Node} x Input node.
13+
* @param {any} value
14+
*/
15+
export default function insertAfter(x, value) {
16+
if (isEmpty(x)) throw new Error('input list is empty');
17+
assert(isNonEmpty(x));
18+
_insertAfter(x, value);
19+
}

src/single.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ import Node from './Node.js';
77
* @return {Node} The node at the front of the list.
88
*/
99
export default function single(value) {
10-
return new Node(value);
10+
return new Node(value, null);
1111
}

src/unshift.js

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import assert from 'assert';
22

3-
// eslint-disable-next-line no-unused-vars
43
import Node from './Node.js';
54
import isList from './isList.js';
6-
import _setNext from './_setNext.js';
7-
import single from './single.js';
85

96
/**
107
* Unshift value to list.
@@ -15,7 +12,5 @@ import single from './single.js';
1512
*/
1613
export default function unshift(x, value) {
1714
assert(isList(x));
18-
const y = single(value);
19-
_setNext(y, x);
20-
return y;
15+
return new Node(value, x);
2116
}

test/src/api.js

+7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
value,
1616
setValue,
1717
values,
18+
insertAfter,
1819
} from '../../src/index.js';
1920

2021
const toArray = (first) => list(values(first));
@@ -28,6 +29,7 @@ test('API', (t) => {
2829
t.throws(() => shift(A), {message: /empty/});
2930
t.throws(() => value(A), {message: /empty/});
3031
t.throws(() => setValue(A, {}), {message: /empty/});
32+
t.throws(() => insertAfter(A, {}), {message: /empty/});
3133
t.throws(() => last(A), {message: /empty/});
3234

3335
t.false(isLast(A));
@@ -73,4 +75,9 @@ test('API', (t) => {
7375

7476
t.deepEqual(toArray(A), [8, 2, 1, 4, 3, 7]);
7577
t.deepEqual(toArray(B), []);
78+
79+
insertAfter(A, 9);
80+
t.deepEqual(toArray(A), [8, 9, 2, 1, 4, 3, 7]);
81+
insertAfter(last(A), 5);
82+
t.deepEqual(toArray(A), [8, 9, 2, 1, 4, 3, 7, 5]);
7683
});

0 commit comments

Comments
 (0)