diff --git a/src/first.js b/src/first.js new file mode 100644 index 0000000..5cbbd6d --- /dev/null +++ b/src/first.js @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md. + */ + +/** + * @module utils/first + */ + +/** + * Returns first item of the given `iterable`. + * + * @param {Iterable.<*>} iterable + * @returns {*} + */ +export default function first( iterable ) { + const iteratorItem = iterable.next(); + + if ( iteratorItem.done ) { + return null; + } + + return iteratorItem.value; +} diff --git a/tests/first.js b/tests/first.js new file mode 100644 index 0000000..4f778d4 --- /dev/null +++ b/tests/first.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md. + */ + +import first from '../src/first'; + +describe( 'utils', () => { + describe( 'first', () => { + it( 'should return first item', () => { + const collection = [ 11, 22 ]; + const iterator = collection[ Symbol.iterator ](); + + expect( first( iterator ) ).to.equal( 11 ); + } ); + + it( 'should return null if iterator is empty', () => { + const collection = []; + const iterator = collection[ Symbol.iterator ](); + + expect( first( iterator ) ).to.be.null; + } ); + + it( 'should consume the iterating item', () => { + const collection = [ 11, 22 ]; + const iterator = collection[ Symbol.iterator ](); + + first( iterator ); + + expect( iterator.next().value ).to.equal( 22 ); + } ); + } ); +} );