diff --git a/src/index.ts b/src/index.ts index 3833487..6eacc20 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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'; diff --git a/src/utils/range.ts b/src/utils/range.ts new file mode 100644 index 0000000..e71869e --- /dev/null +++ b/src/utils/range.ts @@ -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; +} diff --git a/tests/utils/range.test.ts b/tests/utils/range.test.ts new file mode 100644 index 0000000..6e804e0 --- /dev/null +++ b/tests/utils/range.test.ts @@ -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([]); + }); + +});