You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
7.0 KiB
221 lines
7.0 KiB
/*
|
|
YUI 3.17.2 (build 9c3c78e)
|
|
Copyright 2014 Yahoo! Inc. All rights reserved.
|
|
Licensed under the BSD License.
|
|
http://yuilibrary.com/license/
|
|
*/
|
|
|
|
YUI.add('arraylist', function (Y, NAME) {
|
|
|
|
/**
|
|
* Collection utilities beyond what is provided in the YUI core
|
|
* @module collection
|
|
* @submodule arraylist
|
|
*/
|
|
|
|
var YArray = Y.Array,
|
|
YArray_each = YArray.each,
|
|
ArrayListProto;
|
|
|
|
/**
|
|
* Generic ArrayList class for managing lists of items and iterating operations
|
|
* over them. The targeted use for this class is for augmentation onto a
|
|
* class that is responsible for managing multiple instances of another class
|
|
* (e.g. NodeList for Nodes). The recommended use is to augment your class with
|
|
* ArrayList, then use ArrayList.addMethod to mirror the API of the constituent
|
|
* items on the list's API.
|
|
*
|
|
* The default implementation creates immutable lists, but mutability can be
|
|
* provided via the arraylist-add submodule or by implementing mutation methods
|
|
* directly on the augmented class's prototype.
|
|
*
|
|
* @class ArrayList
|
|
* @constructor
|
|
* @param items { Array } array of items this list will be responsible for
|
|
*/
|
|
function ArrayList( items ) {
|
|
if ( items !== undefined ) {
|
|
this._items = Y.Lang.isArray( items ) ? items : YArray( items );
|
|
} else {
|
|
// ||= to support lazy initialization from augment
|
|
this._items = this._items || [];
|
|
}
|
|
}
|
|
|
|
ArrayListProto = {
|
|
/**
|
|
* Get an item by index from the list. Override this method if managing a
|
|
* list of objects that have a different public representation (e.g. Node
|
|
* instances vs DOM nodes). The iteration methods that accept a user
|
|
* function will use this method for access list items for operation.
|
|
*
|
|
* @method item
|
|
* @param i { Integer } index to fetch
|
|
* @return { mixed } the item at the requested index
|
|
*/
|
|
item: function ( i ) {
|
|
return this._items[i];
|
|
},
|
|
|
|
/**
|
|
* <p>Execute a function on each item of the list, optionally providing a
|
|
* custom execution context. Default context is the item.</p>
|
|
*
|
|
* <p>The callback signature is <code>callback( item, index )</code>.</p>
|
|
*
|
|
* @method each
|
|
* @param fn { Function } the function to execute
|
|
* @param context { mixed } optional override 'this' in the function
|
|
* @return { ArrayList } this instance
|
|
* @chainable
|
|
*/
|
|
each: function ( fn, context ) {
|
|
YArray_each( this._items, function ( item, i ) {
|
|
item = this.item( i );
|
|
|
|
fn.call( context || item, item, i, this );
|
|
}, this);
|
|
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* <p>Execute a function on each item of the list, optionally providing a
|
|
* custom execution context. Default context is the item.</p>
|
|
*
|
|
* <p>The callback signature is <code>callback( item, index )</code>.</p>
|
|
*
|
|
* <p>Unlike <code>each</code>, if the callback returns true, the
|
|
* iteration will stop.</p>
|
|
*
|
|
* @method some
|
|
* @param fn { Function } the function to execute
|
|
* @param context { mixed } optional override 'this' in the function
|
|
* @return { Boolean } True if the function returned true on an item
|
|
*/
|
|
some: function ( fn, context ) {
|
|
return YArray.some( this._items, function ( item, i ) {
|
|
item = this.item( i );
|
|
|
|
return fn.call( context || item, item, i, this );
|
|
}, this);
|
|
},
|
|
|
|
/**
|
|
* Finds the first index of the needle in the managed array of items.
|
|
*
|
|
* @method indexOf
|
|
* @param needle { mixed } The item to search for
|
|
* @return { Integer } Array index if found. Otherwise -1
|
|
*/
|
|
indexOf: function ( needle ) {
|
|
return YArray.indexOf( this._items, needle );
|
|
},
|
|
|
|
/**
|
|
* How many items are in this list?
|
|
*
|
|
* @method size
|
|
* @return { Integer } Number of items in the list
|
|
*/
|
|
size: function () {
|
|
return this._items.length;
|
|
},
|
|
|
|
/**
|
|
* Is this instance managing any items?
|
|
*
|
|
* @method isEmpty
|
|
* @return { Boolean } true if 1 or more items are being managed
|
|
*/
|
|
isEmpty: function () {
|
|
return !this.size();
|
|
},
|
|
|
|
/**
|
|
* Provides an array-like representation for JSON.stringify.
|
|
*
|
|
* @method toJSON
|
|
* @return { Array } an array representation of the ArrayList
|
|
*/
|
|
toJSON: function () {
|
|
return this._items;
|
|
}
|
|
};
|
|
// Default implementation does not distinguish between public and private
|
|
// item getter
|
|
/**
|
|
* Protected method for optimizations that may be appropriate for API
|
|
* mirroring. Similar in functionality to <code>item</code>, but is used by
|
|
* methods added with <code>ArrayList.addMethod()</code>.
|
|
*
|
|
* @method _item
|
|
* @protected
|
|
* @param i { Integer } Index of item to fetch
|
|
* @return { mixed } The item appropriate for pass through API methods
|
|
*/
|
|
ArrayListProto._item = ArrayListProto.item;
|
|
|
|
// Mixed onto existing proto to preserve constructor NOT being an own property.
|
|
// This has bitten me when composing classes by enumerating, copying prototypes.
|
|
Y.mix(ArrayList.prototype, ArrayListProto);
|
|
|
|
Y.mix( ArrayList, {
|
|
|
|
/**
|
|
* <p>Adds a pass through method to dest (typically the prototype of a list
|
|
* class) that calls the named method on each item in the list with
|
|
* whatever parameters are passed in. Allows for API indirection via list
|
|
* instances.</p>
|
|
*
|
|
* <p>Accepts a single string name or an array of string names.</p>
|
|
*
|
|
* <pre><code>list.each( function ( item ) {
|
|
* item.methodName( 1, 2, 3 );
|
|
* } );
|
|
* // becomes
|
|
* list.methodName( 1, 2, 3 );</code></pre>
|
|
*
|
|
* <p>Additionally, the pass through methods use the item retrieved by the
|
|
* <code>_item</code> method in case there is any special behavior that is
|
|
* appropriate for API mirroring.</p>
|
|
*
|
|
* <p>If the iterated method returns a value, the return value from the
|
|
* added method will be an array of values with each value being at the
|
|
* corresponding index for that item. If the iterated method does not
|
|
* return a value, the added method will be chainable.
|
|
*
|
|
* @method addMethod
|
|
* @static
|
|
* @param dest {Object} Object or prototype to receive the iterator method
|
|
* @param name {String|String[]} Name of method of methods to create
|
|
*/
|
|
addMethod: function ( dest, names ) {
|
|
|
|
names = YArray( names );
|
|
|
|
YArray_each( names, function ( name ) {
|
|
dest[ name ] = function () {
|
|
var args = YArray( arguments, 0, true ),
|
|
ret = [];
|
|
|
|
YArray_each( this._items, function ( item, i ) {
|
|
item = this._item( i );
|
|
|
|
var result = item[ name ].apply( item, args );
|
|
|
|
if ( result !== undefined && result !== item ) {
|
|
ret[i] = result;
|
|
}
|
|
}, this);
|
|
|
|
return ret.length ? ret : this;
|
|
};
|
|
} );
|
|
}
|
|
} );
|
|
|
|
Y.ArrayList = ArrayList;
|
|
|
|
|
|
}, '3.17.2', {"requires": ["yui-base"]});
|
|
|