Skip to content

Commit

Permalink
feat: add range function (#42)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmbutler27 committed Jul 19, 2024
1 parent bd26fc7 commit d4e589e
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ export * from './utils/get';
export * from './utils/escape-html';
export * from './utils/make-template';
export * from './utils/uniq';
export * from './utils/range';
27 changes: 27 additions & 0 deletions src/utils/range.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* 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;
};
41 changes: 41 additions & 0 deletions tests/utils/range.test.ts
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([]);
});
});

0 comments on commit d4e589e

Please sign in to comment.