@@ -38,18 +38,66 @@ var ITERATOR_SYMBOL = require( '@stdlib/symbol/iterator' );
3838var HAS_ITERATOR_SYMBOL = hasIteratorSymbolSupport ( ) ;
3939
4040
41+ // FUNCTIONS //
42+
43+ /**
44+ * Creates a filled "generic" array.
45+ *
46+ * @private
47+ * @param {NonNegativeInteger } len - array length
48+ * @param {* } value - fill value
49+ * @returns {Array } filled array
50+ */
51+ function filled ( len , value ) {
52+ var arr ;
53+ var i ;
54+
55+ // Manually push elements in order to ensure "fast" elements...
56+ arr = [ ] ;
57+ for ( i = 0 ; i < len ; i ++ ) {
58+ arr . push ( value ) ;
59+ }
60+ return arr ;
61+ }
62+
63+ /**
64+ * Creates a filled "generic" array from an iterator.
65+ *
66+ * @private
67+ * @param {Iterator } it - iterator
68+ * @param {* } value - fill value
69+ * @returns {Array } filled array
70+ */
71+ function filledIterator ( it , value ) {
72+ var arr ;
73+ var v ;
74+
75+ arr = [ ] ;
76+ while ( true ) {
77+ v = it . next ( ) ;
78+ if ( hasOwnProp ( v , 'value' ) ) {
79+ arr . push ( value ) ;
80+ }
81+ if ( v . done ) {
82+ break ;
83+ }
84+ }
85+ return arr ;
86+ }
87+
88+
4189// MAIN //
4290
4391/**
4492* Creates a filled array.
4593*
4694* @param {* } [value] - fill value
47- * @param {(NonNegativeInteger|TypedArray|ArrayLikeObject|ArrayBuffer) } [arg] - a length, typed array, array-like object, or buffer
95+ * @param {(NonNegativeInteger|TypedArray|ArrayLikeObject|ArrayBuffer|Iterable ) } [arg] - a length, typed array, array-like object, buffer, or iterable
4896* @param {NonNegativeInteger } [byteOffset=0] - byte offset
4997* @param {NonNegativeInteger } [length] - view length
5098* @param {string } [dtype="float64"] - data type
5199* @throws {TypeError } must provide a recognized data type
52- * @throws {TypeError } must provide a length, typed array, array-like object, or buffer
100+ * @throws {TypeError } must provide a length, typed array, array-like object, buffer, or iterable
53101* @throws {Error } creating a generic array from an `ArrayBuffer` is not supported
54102* @returns {(TypedArray|Array) } array or typed array
55103*
@@ -137,8 +185,6 @@ function filledarray() {
137185 var arr ;
138186 var len ;
139187 var arg ;
140- var v ;
141- var i ;
142188
143189 nargs = arguments . length ;
144190 nargs -= 1 ;
@@ -165,13 +211,7 @@ function filledarray() {
165211 len = arg . length ;
166212 }
167213 if ( len !== void 0 ) {
168- arr = [ ] ;
169-
170- // Manually push elements in order to ensure "fast" elements...
171- for ( i = 0 ; i < len ; i ++ ) {
172- arr . push ( value ) ;
173- }
174- return arr ;
214+ return filled ( len , value ) ;
175215 }
176216 if ( isArrayBuffer ( arg ) ) {
177217 throw new Error ( 'invalid arguments. Creating a generic array from an ArrayBuffer is not supported.' ) ;
@@ -187,17 +227,7 @@ function filledarray() {
187227 if ( ! isFunction ( arg . next ) ) {
188228 throw new TypeError ( 'invalid argument. Must provide a length, typed array, array-like object, or an iterable.' ) ;
189229 }
190- arr = [ ] ;
191- while ( true ) {
192- v = arg . next ( ) ;
193- if ( hasOwnProp ( v , 'value' ) ) {
194- arr . push ( value ) ;
195- }
196- if ( v . done ) {
197- break ;
198- }
199- }
200- return arr ;
230+ return filledIterator ( arg , value ) ;
201231 }
202232 throw new TypeError ( 'invalid argument. Must provide a length, typed array, array-like object, or an iterable. Value: `' + arg + '`.' ) ;
203233 } else if ( isArrayBuffer ( arg ) ) {
@@ -216,7 +246,7 @@ function filledarray() {
216246 arr = new ctor ( arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
217247 }
218248 value = arguments [ 0 ] ;
219- if ( arr . length > 0 && value !== 0 ) { // i.e., nonzero
249+ if ( arr . length > 0 && value !== 0 ) { // we only need to fill a typed array if the fill value isn't zero, as typed arrays are always zero-initialized
220250 gfill ( arr . length , value , arr , 1 ) ;
221251 }
222252 return arr ;
0 commit comments