forked from silvermine/toolbox
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add range function (silvermine#42)
- Loading branch information
1 parent
bd26fc7
commit 02e9cc8
Showing
3 changed files
with
68 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/** | ||
* Creates an array of numbers (positive and/or negative) progressing from | ||
* start up to, but not including, end. A step of -1 is used if a negative start | ||
* is specified without an end or step. If end is not specified, it's set to | ||
* start with start then set to 0. | ||
*/ | ||
export const range = (start: number, end?: number, step?: number): number[] => { | ||
if (end === undefined) { | ||
end = start | ||
start = 0 | ||
} | ||
step = step ?? (start < end ? 1 : -1) | ||
|
||
if (step === 0) { | ||
const length = Math.max(end - start, 0) | ||
return Array(length).fill(start) | ||
} | ||
|
||
const length = Math.max(Math.ceil((end - start) / step), 0), | ||
result = Array(length) | ||
|
||
for (let i = 0; i < length; i++) { | ||
result[i] = start + (i * step) | ||
} | ||
return result | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import { expect } from 'chai'; | ||
import {range} from '../../src'; | ||
|
||
|
||
describe('range', () => { | ||
it('works when only start is provided', () => { | ||
expect(range(4)).to.eql([0, 1, 2, 3]) | ||
}) | ||
|
||
it('works when only start and end are provided', () => { | ||
expect(range(1, 5)).to.eql([1, 2, 3, 4]) | ||
}) | ||
|
||
it('works when start, end, and step is provided', () => { | ||
expect(range(0, 20, 5)).to.eql([0, 5, 10, 15]) | ||
}) | ||
|
||
it('works when start is set to a negative number', () => [ | ||
expect(range(-4)).to.eql([0, -1, -2, -3]) | ||
]) | ||
|
||
it('fills array with start value if step is zero', () => { | ||
expect(range(1, 4, 0)).to.eql([1, 1, 1]) | ||
}) | ||
|
||
it('works when step is a negative number ', () => { | ||
expect(range(2, -4, -2)).to.eql([2, 0, -2]) | ||
}) | ||
|
||
it('return an empty array when end and start are the same', () => { | ||
expect(range(0, 0)).to.eql([]) | ||
}) | ||
|
||
it('returns an empty array if only start is provided and equals zero', () => { | ||
expect(range(0)).to.eql([]) | ||
}) | ||
|
||
it('returns an empty array if arguments do not work', () => { | ||
expect(range(5, 1, 2)).to.eql([]) | ||
}) | ||
}) |