From ecf1d9a9a9ab8dac7248234a83c6a79650fedc58 Mon Sep 17 00:00:00 2001 From: RuSaG0 Date: Thu, 9 Dec 2021 18:10:42 +0300 Subject: [PATCH 1/2] FindMinIterator Do the `standard` thing. Rename `FindMin` to `FindMinIterator` Rename to `FindMinIterator` Pull `FindMin` from `master` --- Maths/FindMinIterator.js | 36 +++++++++++++++++++ Maths/test/FindMinIterator.test.js | 55 ++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 Maths/FindMinIterator.js create mode 100644 Maths/test/FindMinIterator.test.js diff --git a/Maths/FindMinIterator.js b/Maths/FindMinIterator.js new file mode 100644 index 0000000000..fc1c7d0073 --- /dev/null +++ b/Maths/FindMinIterator.js @@ -0,0 +1,36 @@ +/** + * @function FindMinIterator + * @description Function to find the minimum number given in an array. + */ + +const FindMinIterator = (_iterable, _selector = undefined) => { + let min + + const iterator = _iterable[Symbol.iterator]() + if (!_selector) { + let current = iterator.next() + if (current.done) { return undefined } + min = current.value + + current = iterator.next() + while (!current.done) { + const x = current.value + if (x < min) { min = x } + current = iterator.next() + } + } else { + let current = iterator.next() + if (current.done) { return undefined } + min = _selector(current.value) + + current = iterator.next() + while (!current.done) { + const x = _selector(current.value) + if (x < min) { min = x } + current = iterator.next() + } + } + return min +} + +export { FindMinIterator } diff --git a/Maths/test/FindMinIterator.test.js b/Maths/test/FindMinIterator.test.js new file mode 100644 index 0000000000..3bd38a2ec9 --- /dev/null +++ b/Maths/test/FindMinIterator.test.js @@ -0,0 +1,55 @@ +import { FindMinIterator } from '../FindMinIterator' + +describe('FindMinIterator', () => { + // ---------------------------------------------------------------------- + test('given empty array then min is undefined', () => { + expect(FindMinIterator([])).toBeUndefined() + }) + // ---------------------------------------------------------------------- + test('given single value array then min is found', () => { + expect(FindMinIterator([1])).toBe(1) + expect(FindMinIterator([-1])).toBe(-1) + expect(FindMinIterator([0])).toBe(0) + }) + // ---------------------------------------------------------------------- + test('given array then min is found', () => { + expect(FindMinIterator([1, 2])).toBe(1) + expect(FindMinIterator([-1, 10])).toBe(-1) + expect(FindMinIterator([0, 100])).toBe(0) + expect(FindMinIterator([100, 0])).toBe(0) + expect(FindMinIterator([100, 50, 20, 0, -100, 0, 2, 30, 45, 99, 104, 23])).toBe(-100) + }) + // ---------------------------------------------------------------------- + test('given empty generator then min is undefined', () => { + const src = function* () { } // eslint-disable-line + expect(FindMinIterator(src())).toBeUndefined() + }) + // ---------------------------------------------------------------------- + test('given generator then min is found', () => { + const src = function* () { // eslint-disable-line + yield 1 + yield -1 + yield 0 + } + expect(FindMinIterator(src())).toBe(-1) + }) + // ---------------------------------------------------------------------- + test('given string generator then min string length is found', () => { + const src = function* () { // eslint-disable-line + yield 'abc' + yield 'de' + yield 'qwerty' + } + expect(FindMinIterator(src(), _x => _x.length)).toBe(2) + }) + // ---------------------------------------------------------------------- + test('given array of objects then min accessor is found', () => { + const array = [ + { name: 'Item #1', price: 1.0 }, + { name: 'Item #2', price: 0.0 }, + { name: 'Item #3', price: -1.0 } + ] + expect(FindMinIterator(array, _x => _x.price)).toBe(-1) + expect(FindMinIterator(array, _x => _x.name)).toBe('Item #1') + }) +}) From de1522d5a273ef2aa166b8a4f6fc78192674ab6d Mon Sep 17 00:00:00 2001 From: TrasherDK Date: Wed, 16 Mar 2022 12:52:02 +0100 Subject: [PATCH 2/2] Remove these separator comments. --- Maths/test/FindMinIterator.test.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Maths/test/FindMinIterator.test.js b/Maths/test/FindMinIterator.test.js index 3bd38a2ec9..9f4200dc1f 100644 --- a/Maths/test/FindMinIterator.test.js +++ b/Maths/test/FindMinIterator.test.js @@ -1,17 +1,16 @@ import { FindMinIterator } from '../FindMinIterator' describe('FindMinIterator', () => { - // ---------------------------------------------------------------------- test('given empty array then min is undefined', () => { expect(FindMinIterator([])).toBeUndefined() }) - // ---------------------------------------------------------------------- + test('given single value array then min is found', () => { expect(FindMinIterator([1])).toBe(1) expect(FindMinIterator([-1])).toBe(-1) expect(FindMinIterator([0])).toBe(0) }) - // ---------------------------------------------------------------------- + test('given array then min is found', () => { expect(FindMinIterator([1, 2])).toBe(1) expect(FindMinIterator([-1, 10])).toBe(-1) @@ -19,12 +18,12 @@ describe('FindMinIterator', () => { expect(FindMinIterator([100, 0])).toBe(0) expect(FindMinIterator([100, 50, 20, 0, -100, 0, 2, 30, 45, 99, 104, 23])).toBe(-100) }) - // ---------------------------------------------------------------------- + test('given empty generator then min is undefined', () => { const src = function* () { } // eslint-disable-line expect(FindMinIterator(src())).toBeUndefined() }) - // ---------------------------------------------------------------------- + test('given generator then min is found', () => { const src = function* () { // eslint-disable-line yield 1 @@ -33,7 +32,7 @@ describe('FindMinIterator', () => { } expect(FindMinIterator(src())).toBe(-1) }) - // ---------------------------------------------------------------------- + test('given string generator then min string length is found', () => { const src = function* () { // eslint-disable-line yield 'abc' @@ -42,7 +41,7 @@ describe('FindMinIterator', () => { } expect(FindMinIterator(src(), _x => _x.length)).toBe(2) }) - // ---------------------------------------------------------------------- + test('given array of objects then min accessor is found', () => { const array = [ { name: 'Item #1', price: 1.0 },