Skip to content

Commit 09b68ee

Browse files
kborucinskikrystianborucinski
authored andcommitted
Add array/slidingWindow method (#36)
* Add sliding window method * Add additional test cases * Update after code review * Update description for method and test cases * Update test cases descriptions Co-authored-by: krystianborucinski <krystian.borucinski@sandstream.pl>
1 parent 2d21f7f commit 09b68ee

File tree

9 files changed

+173
-0
lines changed

9 files changed

+173
-0
lines changed

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,34 @@ Skips the given count of elements from the given array.
479479
```
480480
<!-- prettier-ignore-end -->
481481

482+
#### slidingWindow
483+
484+
Returns a new array composed of tuples of the given sliding window length of consecutive elements.
485+
486+
##### Type signature
487+
488+
<!-- prettier-ignore-start -->
489+
```typescript
490+
(count: number) => (xs: any[]) => any[][]
491+
```
492+
<!-- prettier-ignore-end -->
493+
494+
##### Examples
495+
496+
<!-- prettier-ignore-start -->
497+
```javascript
498+
slidingWindow(2)([1, 2, 3, 4]); // ⇒ [[1, 2], [2, 3], [3, 4]]
499+
```
500+
501+
```javascript
502+
slidingWindow(3)([1, 2, 3, 4, 5]); // ⇒ [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
503+
```
504+
505+
```javascript
506+
slidingWindow(1)([1, 2, 3, 4, 5, 6]); // ⇒ [[1], [2], [3], [4], [5], [6]]
507+
```
508+
<!-- prettier-ignore-end -->
509+
482510
#### sort
483511

484512
Sorts the given array without mutating it.

array/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,34 @@ Skips the given count of elements from the given array.
462462
```
463463
<!-- prettier-ignore-end -->
464464

465+
# slidingWindow
466+
467+
Returns a new array composed of tuples of the given sliding window length of consecutive elements.
468+
469+
## Type signature
470+
471+
<!-- prettier-ignore-start -->
472+
```typescript
473+
(count: number) => (xs: any[]) => any[][]
474+
```
475+
<!-- prettier-ignore-end -->
476+
477+
## Examples
478+
479+
<!-- prettier-ignore-start -->
480+
```javascript
481+
slidingWindow(2)([1, 2, 3, 4]); // ⇒ [[1, 2], [2, 3], [3, 4]]
482+
```
483+
484+
```javascript
485+
slidingWindow(3)([1, 2, 3, 4, 5]); // ⇒ [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
486+
```
487+
488+
```javascript
489+
slidingWindow(1)([1, 2, 3, 4, 5, 6]); // ⇒ [[1], [2], [3], [4], [5], [6]]
490+
```
491+
<!-- prettier-ignore-end -->
492+
465493
# sort
466494

467495
Sorts the given array without mutating it.

array/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import shuffle from "./shuffle.js";
3333
import shuffleInPlace from "./shuffleInPlace.js";
3434
import single from "./single.js";
3535
import skip from "./skip.js";
36+
import slidingWindow from "./slidingWindow.js";
3637
import sort from "./sort.js";
3738
import sum from "./sum.js";
3839
import take from "./take.js";
@@ -76,6 +77,7 @@ export {
7677
shuffleInPlace,
7778
single,
7879
skip,
80+
slidingWindow,
7981
sort,
8082
sum,
8183
take,
@@ -120,6 +122,7 @@ export default {
120122
shuffleInPlace,
121123
single,
122124
skip,
125+
slidingWindow,
123126
sort,
124127
sum,
125128
take,

array/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import shuffle from "./shuffle";
3333
import shuffleInPlace from "./shuffleInPlace";
3434
import single from "./single";
3535
import skip from "./skip";
36+
import slidingWindow from "./slidingWindow";
3637
import sort from "./sort";
3738
import sum from "./sum";
3839
import take from "./take";
@@ -76,6 +77,7 @@ export {
7677
shuffleInPlace,
7778
single,
7879
skip,
80+
slidingWindow,
7981
sort,
8082
sum,
8183
take,
@@ -120,6 +122,7 @@ export default {
120122
shuffleInPlace,
121123
single,
122124
skip,
125+
slidingWindow,
123126
sort,
124127
sum,
125128
take,

array/slidingWindow.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default count => xs =>
2+
xs
3+
.map((_, index, source) => source.slice(index, index + count))
4+
.filter(element => element.length > 0 && element.length === count);

array/slidingWindow.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "slidingWindow",
3+
"description": "Returns a new array composed of tuples of the given sliding window length of consecutive elements.",
4+
"signature": "(count: number) => (xs: any[]) => any[][]",
5+
"examples": [
6+
{
7+
"language": "javascript",
8+
"content": "slidingWindow(2)([1, 2, 3, 4]); // ⇒ [[1, 2], [2, 3], [3, 4]]"
9+
},
10+
{
11+
"language": "javascript",
12+
"content": "slidingWindow(3)([1, 2, 3, 4, 5]); // ⇒ [[1, 2, 3], [2, 3, 4], [3, 4, 5]]"
13+
},
14+
{
15+
"language": "javascript",
16+
"content": "slidingWindow(1)([1, 2, 3, 4, 5, 6]); // ⇒ [[1], [2], [3], [4], [5], [6]]"
17+
}
18+
],
19+
"questions": ["TODO: List questions that may this function answer."]
20+
}

array/slidingWindow.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# slidingWindow
2+
3+
Returns a new array composed of tuples of the given sliding window length of consecutive elements.
4+
5+
## Type signature
6+
7+
<!-- prettier-ignore-start -->
8+
```typescript
9+
(count: number) => (xs: any[]) => any[][]
10+
```
11+
<!-- prettier-ignore-end -->
12+
13+
## Examples
14+
15+
<!-- prettier-ignore-start -->
16+
```javascript
17+
slidingWindow(2)([1, 2, 3, 4]); // ⇒ [[1, 2], [2, 3], [3, 4]]
18+
```
19+
20+
```javascript
21+
slidingWindow(3)([1, 2, 3, 4, 5]); // ⇒ [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
22+
```
23+
24+
```javascript
25+
slidingWindow(1)([1, 2, 3, 4, 5, 6]); // ⇒ [[1], [2], [3], [4], [5], [6]]
26+
```
27+
<!-- prettier-ignore-end -->

array/slidingWindow.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/* eslint-env jest */
2+
// @ts-ignore ambiguous import
3+
import slidingWindow from "./slidingWindow.ts";
4+
5+
describe("slidingWindow", () => {
6+
it("should return an array of pairs of consecutive elements for sliding window length of 2", () => {
7+
expect(slidingWindow(2)([1, 2, 3, 4, 5, 6])).toEqual([
8+
[1, 2],
9+
[2, 3],
10+
[3, 4],
11+
[4, 5],
12+
[5, 6]
13+
]);
14+
});
15+
16+
it("should return an array composed of triples of consecutive elements for sliding window length of 3", () => {
17+
expect(slidingWindow(3)([1, 2, 3, 4, 5, 6])).toEqual([
18+
[1, 2, 3],
19+
[2, 3, 4],
20+
[3, 4, 5],
21+
[4, 5, 6]
22+
]);
23+
});
24+
25+
it("should return an array composed of quadruples of consecutive elements for sliding window length of 4", () => {
26+
expect(slidingWindow(4)([1, 2, 3, 4, 5, 6])).toEqual([
27+
[1, 2, 3, 4],
28+
[2, 3, 4, 5],
29+
[3, 4, 5, 6]
30+
]);
31+
});
32+
33+
it("should return a wrapped array when sliding window size is equal to length of the given array", () => {
34+
expect(slidingWindow(6)([1, 2, 3, 4, 5, 6])).toEqual([[1, 2, 3, 4, 5, 6]]);
35+
});
36+
37+
it("should return an array of wrapped values in arrays when sliding window length is 1", () => {
38+
expect(slidingWindow(1)([1, 2, 3, 4, 5, 6])).toEqual([
39+
[1],
40+
[2],
41+
[3],
42+
[4],
43+
[5],
44+
[6]
45+
]);
46+
});
47+
48+
it("should return an empty array when sliding window size is greater than length of the given array", () => {
49+
expect(slidingWindow(3)([])).toEqual([]);
50+
});
51+
52+
it("should return an empty array when sliding window size is less than or equal to zero", () => {
53+
expect(slidingWindow(0)([1, 2, 3])).toEqual([]);
54+
expect(slidingWindow(-1)([1, 2, 3])).toEqual([]);
55+
});
56+
});

array/slidingWindow.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default (count: number) => (xs: any[]) =>
2+
xs
3+
.map((_, index, source) => source.slice(index, index + count))
4+
.filter(element => element.length > 0 && element.length === count);

0 commit comments

Comments
 (0)