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.
Merge pull request silvermine#55 from jmbutler27/jobutler/range
feat: add range function (silvermine#42)
- Loading branch information
Showing
3 changed files
with
66 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,24 @@ | ||
/** | ||
* 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 function range(start: number, end?: number, step?: number): number[] { | ||
if (end === undefined) { | ||
end = start; | ||
start = 0; | ||
} | ||
|
||
if (!step) { | ||
step = start < end ? 1 : -1; | ||
} | ||
|
||
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('works when step is set to zero', () => { | ||
expect(range(1, 4, 0)).to.eql([ 1, 2, 3 ]); | ||
}); | ||
|
||
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([]); | ||
}); | ||
|
||
}); |