diff --git a/Libraries/Utilities/__tests__/mapWithSeparator-test.js b/Libraries/Utilities/__tests__/mapWithSeparator-test.js new file mode 100644 index 0000000000..4dea1ec7bf --- /dev/null +++ b/Libraries/Utilities/__tests__/mapWithSeparator-test.js @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +'use strict'; + +jest.unmock('mapWithSeparator'); + +describe('mapWithSeparator', () => { + const mapWithSeparator = require('mapWithSeparator'); + + it('mapWithSeparator returns expected results', () => { + const array = [1, 2, 3]; + const result = mapWithSeparator( + array, + function(value) { + return value * 2; + }, + function() { + return 0; + } + ); + expect(result).toEqual([2, 0, 4, 0, 6]); + }); + + it('mapWithSeparator indices are correct', () => { + const array = [1, 2, 3]; + const result = mapWithSeparator( + array, + function(value, index) { + return index; + }, + function(index) { + return index; + } + ); + expect(result).toEqual([0, 0, 1, 1, 2]); + }); + + it('mapWithSeparator passes correct array and indices', () => { + const array = [3, 2, 1]; + const result = mapWithSeparator( + array, + function(value, index, arr) { + return arr[index]; + }, + function(index) { + return index; + } + ); + expect(result).toEqual([3, 0, 2, 1, 1]); + }); +}); diff --git a/Libraries/Utilities/mapWithSeparator.js b/Libraries/Utilities/mapWithSeparator.js index 4aa8665c35..ff3048a260 100644 --- a/Libraries/Utilities/mapWithSeparator.js +++ b/Libraries/Utilities/mapWithSeparator.js @@ -1,19 +1,29 @@ /** - * Copyright 2004-present Facebook. All Rights Reserved. + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule mapWithSeparator + * @flow */ 'use strict'; -function mapWithSeparator(array, valueFunction, separatorFunction) { - var results = []; - for (var i = 0; i < array.length; i++) { - results.push(valueFunction(array[i], i, array)); - if (i !== array.length - 1) { - results.push(separatorFunction(i)); +function mapWithSeparator( + items: Array, + itemRenderer: (item: TFrom, index: number, items: Array) => TTo, + spacerRenderer: (index: number) => TTo, +): Array { + const mapped = []; + if (items.length > 0) { + mapped.push(itemRenderer(items[0], 0, items)); + for (let ii = 1; ii < items.length; ii++) { + mapped.push(spacerRenderer(ii - 1), itemRenderer(items[ii], ii, items)); } } - return results; + return mapped; } module.exports = mapWithSeparator;