Skip to content

Commit b3b98d1

Browse files
committed
Fixed slice function and added tests for slice
1 parent 3238a7a commit b3b98d1

File tree

4 files changed

+93
-2
lines changed

4 files changed

+93
-2
lines changed

lib/ArrayFixed.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,21 @@ class ArrayFixed<item> {
9696
}
9797

9898
slice (begin: ?number, end: ?number): ArrayFixed<item> {
99-
return ArrayFixed.fromArray(this._array.slice(begin, end));
99+
if (begin == null) begin = 0;
100+
if (end == null) end = this._array.length;
101+
if (begin < 0) {
102+
begin = Math.max(begin + this._array.length, 0);
103+
}
104+
if (end < 0) {
105+
end = Math.max(end + this._array.length, 0);
106+
}
107+
let count;
108+
if (this._direction) {
109+
count = Math.max(this._count - begin, 0) - Math.max(this._count - end, 0);
110+
} else {
111+
count = Math.max(end - this._count, 0) - Math.max(begin - this._count, 0);
112+
}
113+
return ArrayFixed.fromArray(this._array.slice(begin, end), count);
100114
}
101115

102116
splice (

lib/ArrayFixedDense.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,25 @@ class ArrayFixedDense<item> extends ArrayFixed<item> {
128128
}
129129

130130
slice (begin: ?number, end: ?number): ArrayFixedDense<item> {
131-
return ArrayFixedDense.fromArray(this._array.slice(begin, end));
131+
if (begin == null) begin = 0;
132+
if (end == null) end = this._array.length;
133+
if (begin < 0) {
134+
begin = Math.max(begin + this._array.length, 0);
135+
}
136+
if (end < 0) {
137+
end = Math.max(end + this._array.length, 0);
138+
}
139+
let count;
140+
if (this._direction) {
141+
count = Math.max(this._count - begin, 0) - Math.max(this._count - end, 0);
142+
} else {
143+
count = Math.max(end - this._count, 0) - Math.max(begin - this._count, 0);
144+
}
145+
return ArrayFixedDense.fromArray(
146+
this._array.slice(begin, end),
147+
count,
148+
this._direction
149+
);
132150
}
133151

134152
splice (

test/ArrayFixed.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,27 @@ test('iterator', t => {
4848
t.deepEqual([...arr], [...arrF]);
4949
});
5050

51+
test('slice', t => {
52+
let arr, slice;
53+
arr = new ArrayFixed([1,2,3,4, , ,]);
54+
slice = arr.slice(0, arr.count / 2);
55+
t.deepEqual(slice.toArray(), [1,2]);
56+
slice = arr.slice(arr.count / 2);
57+
t.deepEqual(slice.toArray(), [3,4, , ,]);
58+
slice = arr.slice(0);
59+
t.deepEqual(slice.toArray(), [1,2,3,4, , ,]);
60+
slice = arr.slice(-2);
61+
t.deepEqual(slice.toArray(), [ , ,]);
62+
slice = arr.slice(-3, 4);
63+
t.deepEqual(slice.toArray(), [4]);
64+
slice = arr.slice(-3, -2);
65+
t.deepEqual(slice.toArray(), [4]);
66+
slice = arr.slice(2, 1);
67+
t.deepEqual(slice.toArray(), []);
68+
slice = arr.slice(arr.length);
69+
t.deepEqual(slice.toArray(), []);
70+
});
71+
5172
test('splice', t => {
5273
const arr = new ArrayFixed([1,2,,4,5,,]);
5374
t.is(arr.count, 4);

test/ArrayFixedDense.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,44 @@ test('unsetting elements', t => {
7979
t.deepEqual(arr.toArray(), [ ,]);
8080
});
8181

82+
test('slice', t => {
83+
let arr, slice;
84+
arr = new ArrayFixedDense([1,2,3,4, , ,]);
85+
slice = arr.slice(0, arr.count / 2);
86+
t.deepEqual(slice.toArray(), [1,2]);
87+
slice = arr.slice(arr.count / 2);
88+
t.deepEqual(slice.toArray(), [3,4, , ,]);
89+
slice = arr.slice(0);
90+
t.deepEqual(slice.toArray(), [1,2,3,4, , ,]);
91+
slice = arr.slice(-2);
92+
t.deepEqual(slice.toArray(), [ , ,]);
93+
slice = arr.slice(-3, 4);
94+
t.deepEqual(slice.toArray(), [4]);
95+
slice = arr.slice(-3, -2);
96+
t.deepEqual(slice.toArray(), [4]);
97+
slice = arr.slice(2, 1);
98+
t.deepEqual(slice.toArray(), []);
99+
slice = arr.slice(arr.length);
100+
t.deepEqual(slice.toArray(), []);
101+
arr = new ArrayFixedDense([ , ,1,2,3,4], false);
102+
slice = arr.slice(0, arr.count / 2);
103+
t.deepEqual(slice.toArray(), [ , ,]);
104+
slice = arr.slice(arr.count / 2);
105+
t.deepEqual(slice.toArray(), [1,2,3,4]);
106+
slice = arr.slice(0);
107+
t.deepEqual(slice.toArray(), [ , ,1,2,3,4]);
108+
slice = arr.slice(-2);
109+
t.deepEqual(slice.toArray(), [3,4]);
110+
slice = arr.slice(-3, 4);
111+
t.deepEqual(slice.toArray(), [2]);
112+
slice = arr.slice(-3, -2);
113+
t.deepEqual(slice.toArray(), [2]);
114+
slice = arr.slice(2, 1);
115+
t.deepEqual(slice.toArray(), []);
116+
slice = arr.slice(arr.length);
117+
t.deepEqual(slice.toArray(), []);
118+
});
119+
82120
test('splice', t => {
83121
let arr;
84122
arr = new ArrayFixedDense([1,2,3,4, , ,]);

0 commit comments

Comments
 (0)