From 7da17316c041c48d7391674e3c8fdd283be5828c Mon Sep 17 00:00:00 2001 From: Christian Fleschhut Date: Wed, 1 Nov 2017 23:27:39 +0100 Subject: [PATCH] feat(range): Add range function --- src/index.js | 2 ++ src/range.js | 29 +++++++++++++++++++++++++++++ test/flatten.test.js | 2 +- test/range.test.js | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/range.js create mode 100644 test/range.test.js diff --git a/src/index.js b/src/index.js index 6d2095da..8f9ec934 100644 --- a/src/index.js +++ b/src/index.js @@ -43,6 +43,7 @@ import max from './max' import slugify from './slugify' import convertToRoman from './convertToRoman' import gcd from './gcd' +import range from './range' export { isOdd, @@ -90,4 +91,5 @@ export { slugify, convertToRoman, gcd, + range, } diff --git a/src/range.js b/src/range.js new file mode 100644 index 00000000..18b13774 --- /dev/null +++ b/src/range.js @@ -0,0 +1,29 @@ +export default range + +/** + * @module range + * @description This method creates an array of numbers (positive and/or + * negative) progressing from start up to, but not including, end. + * + * @param {Number} start - The start of the range + * @param {Number} end - The end of the range + * @param {Number} step - The value to increment or decrement by + * @return {Array} - Returns an array of integers containing an arithmetic + * progression + * */ + +function range(start = 0, end, step = 1) { + if (end === undefined) { + end = start + start = 0 + } + + const length = Math.max(Math.ceil((end - start) / step), 0) + const rangeArr = Array(length) + + for (let idx = 0; idx < length; idx++, start += step) { + rangeArr[idx] = start + } + + return rangeArr +} diff --git a/test/flatten.test.js b/test/flatten.test.js index a0c6d573..03168578 100644 --- a/test/flatten.test.js +++ b/test/flatten.test.js @@ -21,5 +21,5 @@ test('deep flattens an array of arrays', t => { const original = [1, 2, [3, 4, [5, 6], 7], 8] const expected = [1, 2, 3, 4, 5, 6, 7, 8] const actual = flatten(original) - t.same(actual, expected) + t.deepEqual(actual, expected) }) diff --git a/test/range.test.js b/test/range.test.js new file mode 100644 index 00000000..a52585be --- /dev/null +++ b/test/range.test.js @@ -0,0 +1,32 @@ +import test from 'ava' +import { range } from '../src' + +test('creates an array of numbers from start up to end', t => { + const expected = [1, 2, 3, 4] + const actual = range(1, 5); + t.deepEqual(actual, expected) +}) + +test('creates an array of numbers starting from zero given an implicit end', t => { + const expected = [0, 1, 2, 3] + const actual = range(4); + t.deepEqual(actual, expected) +}) + +test('creates an array of numbers in given steps', t => { + const expected = [0, 5, 10, 15] + const actual = range(0, 20, 5); + t.deepEqual(actual, expected) +}) + +test('creates an array of negative numbers given a negative step', t => { + const expected = [0, -1, -2, -3] + const actual = range(0, -4, -1); + t.deepEqual(actual, expected) +}) + +test('creates an empty array with no parameters given', t => { + const expected = [] + const actual = range(); + t.deepEqual(actual, expected) +})