@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
882 lines (868 loc) • 42.5 kB
TypeScript
import type { EventedMixin, EventedAccessor } from "./Evented.js";
import type { Types } from "./accessorSupport/types.js";
export type ReadonlyArrayOrCollection<T> = readonly T[] | ReadonlyCollection<T>;
/**
* Event object emitted when a [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/) changes. It contains arrays of added, removed, and moved items.
*
* @since 5.0
*/
export interface CollectionChangeEvent<T = any> {
/**
* An array of items added to the collection using either [add()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#add) or [addMany()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#addMany).
*
* @since 5.0
*/
added: T[];
/**
* An array of items removed from the collection using either [remove()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#remove),
* [removeMany()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#removeMany), [removeAt()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#removeAt), or [removeAll()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#removeAll).
*
* @since 5.0
*/
removed: T[];
/**
* An array of items that moved in the collection using [reorder()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reorder).
*
* @since 5.0
*/
moved: T[];
}
export interface CollectionEventObject<T> {
/**
* Indicates if the [@change](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#event-change) event
* can be cancelled.
*
* @default false
*/
cancellable: boolean;
/**
* Indicates if this event has previously been
* cancelled by another event handler.
*
* @default false
*/
defaultPrevented: boolean;
/** The item to add or remove from the collection. */
item: T;
/**
* A method that prevents the item from being added
* or removed from the collection.
*/
preventDefault(): void;
}
export type CollectionAfterItemEvent<T> = {
/** The item to add or remove from the collection. */
item: T;
};
export type CollectionAfterEvent<T> = {};
export interface CollectionEvents<T> {
/**
* Fires after an item has been [added](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#add), [reordered](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reorder), or [removed](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#remove) from the Collection.
* Using methods of other classes that affect properties of type Collection will also
* cause this event to fire, such as
* [Map.add()](https://developers.arcgis.com/javascript/latest/references/core/Map/#add), [Map.remove()](https://developers.arcgis.com/javascript/latest/references/core/Map/#remove), [Map.reorder()](https://developers.arcgis.com/javascript/latest/references/core/Map/#reorder).
*
* For example, `map.layers.add(newLyr)` and `map.add(newLyr)` which uses [Map.add()](https://developers.arcgis.com/javascript/latest/references/core/Map/#add)
* to add a new layer to the `map.layers` collection will cause this event to fire.
*
* The change event can be used to notify the developer/user of changes to the collection.
* The arrays in the collection event objects are reused. Make a copy of the collection event object if these objects need to be
* processed in your application.
*
* @example
* // This function will fire each time a layer is either added,
* // moved, or removed from the map.layers Collection
* // make a copy of the collection event object for processing
* map.layers.on("change", function(event){
* const copiedEvent = JSON.parse(JSON.stringify(event));
* let newLayers = copiedEvent.added; // An array of layers added to the map.layers Collection
* let reorderedLayers = copiedEvent.moved; // An array of layers moved in the Collection
* let removedLayers = copiedEvent.removed; // An array of layers removed from map
* });
*/
change: CollectionChangeEvent<T>;
/**
* Fires before any modifications are performed on the collection. This event
* can be used to prevent an item from being added or removed from the collection
* by cancelling it with the `event.preventDefault()` method.
*
* @example
* map.layers.on("before-changes", function(event){
* // prevents layers from being added/removed from the map
* event.preventDefault();
* });
*/
"before-changes": CollectionEventObject<T>;
/**
* Fires after an item has been added, reordered or removed from the collection.
*
* @example
* map.layers.on("after-changes", function(event){
* console.log(event, " layer was added/removed from the map.");
* });
*/
"after-changes": CollectionAfterEvent<T>;
/**
* Fires before an item is added to the collection. This event
* can be used to prevent an item from being added to the collection
* by cancelling it with the `event.preventDefault()` method.
*
* @example
* // prevents a layer from being added to the map more than once.
* map.layers.on("before-add", function(event){
* if(map.layers.includes(event.item)){
* event.preventDefault();
* console.log("layer already exists in map.");
* }
* });
*/
"before-add": CollectionEventObject<T>;
/**
* Fires after an item has been added to the collection.
*
* @example
* // indicates a layer has been added to the map
* map.layers.on("after-add", function(event){
* console.log(event.item, " has been added to the map.");
* });
*/
"after-add": CollectionAfterItemEvent<T>;
/**
* Fires before an item has been removed from the collection. This event
* can be used to prevent an item from being removed from the collection
* by cancelling it with the `event.preventDefault()` method.
*
* @example
* // prevents a layer from being removed from the basemap
* map.basemap.baseLayers.on("before-remove", function(event){
* if(map.basemap.baseLayers.includes(event.item)){
* event.preventDefault();
* console.log("layer cannot be removed from basemap.");
* }
* });
*/
"before-remove": CollectionEventObject<T>;
/**
* Fires after an item has been removed from the collection.
*
* @example
* // indicates a layer has been removed from the map
* map.layers.on("after-remove", function(event){
* console.log(event.item, " has been removed from the map.");
* });
*/
"after-remove": CollectionAfterItemEvent<T>;
}
/**
* Collection stores an array of items of the same type.
* It provides useful utility methods for working with items in the Collection, including
* [filter()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#filter), [find()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#find), and [reduce()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reduce).
*
* A Collection can be of any type. For example, [GraphicsLayer.graphics](https://developers.arcgis.com/javascript/latest/references/core/layers/GraphicsLayer/#graphics)
* is a collection of graphics that are stored in the GraphicsLayer. You can use the methods found in the Collection class
* to add, remove, re-order, or manipulate graphics in a GraphicsLayer.
*
* Another example of a Collection is [Map.layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers), which is a Collection of operational layers included in
* the [Map](https://developers.arcgis.com/javascript/latest/references/core/Map/).
*
* ```js
* // Removes a layer from the map using Collection.remove();
* map.layers.remove(layer);
* ```
*
* The [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#event-change) fires each time an item is [added](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#add), [moved](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reorder), or [removed](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#remove)
* from the Collection.
*
* As of version 4.18, you can iterate through the items of a Collection using [for...of](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of).
*
* ```js
* // a collection of graphics displayed in the view
* const graphics = view.graphics;
*
* for (const graphic of graphics){
* // do something with each view graphic
* }
* ```
* As of version 4.23, [reactiveUtils](https://developers.arcgis.com/javascript/latest/references/core/core/reactiveUtils/) can be utilized to watch for property changes on items in a Collection.
*
* ```js
* // reactiveUtils watch method can be used to watch the visible
* // property of each layer within the map.allLayer's collection
* const handle = reactiveUtils.watch(
* () => view.map.allLayers.every((layer) => layer.visible),
* (allVisible) => {
* console.log(`All layers are visible = ${allVisible}`);
* }
* );
* ```
*
* @since 4.0
* @see [GraphicsLayer.graphics](https://developers.arcgis.com/javascript/latest/references/core/layers/GraphicsLayer/#graphics)
* @see [Map.layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers)
*/
export default class Collection<T = any> extends EventedAccessor {
/**
* @deprecated
* Do not directly reference this property.
* Use EventNames and EventTypes helpers from \@arcgis/core/Evented
*/
"@eventTypes": CollectionEvents<T>;
/**
* Determines whether the passed value is a Collection.
*
* @param value - The value to be checked.
* @returns true if the test passes, false otherwise.
*/
static isCollection<T>(value: T): value is Extract<T, Collection<unknown>>;
/**
* Creates a subclass of Collection containing a typed object.
*
* @param type - The type to assign the Collection.
* @returns The typed collection.
* @example
* const [Collection, Point] = await $arcgis.import([
* "@arcgis/core/core/Collection.js",
* "@arcgis/core/geometry/Point.js"
* ]);
* let PointCollection = Collection.ofType(Point);
* let collection = new PointCollection();
* collection.add([-100,40]);
* let point = collection.at(0);
* // point.x = -100; point.y = 40
* });
*/
static ofType<T extends Base, Base = T>(type: (new (...args: any[]) => T) | Types<T, Base>): new (items?: ReadonlyArrayOrCollection<T> | { items?: ReadonlyArrayOrCollection<T>; }) => Collection<T>;
constructor(items?: ReadonlyArrayOrCollection<T>);
/**
* The number of items in the Collection. Like a native Array, setting the length of a Collection can be used to
* remove items from the end of the collection. However, unlike a native Array, you cannot increase the length of the
* collection to reserve space for new items.
*/
accessor length: number;
[Symbol.iterator](): IterableIterator<T>;
/**
* Adds a single item to the collection. The [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after an item is added to the Collection.
*
* @param item - The item to add.
* @param index - Zero-based index of where in the collection to add the item.
* If not specified, the items will be added at the end.
* @example
* let gpc = new Graphic(); // Creates a new graphic
* let layer = new GraphicsLayer(); // Creates a new graphics layer
* layer.graphics.add(gpc); // Adds graphic to layer's graphics collection
*/
add(item: T, index?: number): this;
/**
* Adds multiple items to the collection. The [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after items are added to the Collection.
*
* @param items - An array or collection of items to add.
* @param index - Zero-based index of where in the collection to add the items.
* If not specified, the items will be added at the end.
* @example
* // Creates two new graphics
* let gpc1 = new Graphic();
* let gpc2 = new Graphic();
*
* let layer = new GraphicsLayer(); // Creates a new graphics layer
*
* // Adds both graphics to layer's graphics collection
* layer.graphics.addMany([gpc1, gpc2]);
*/
addMany(items: ReadonlyArrayOrCollection<T>, index?: number): this;
/**
* Returns the item at the specified index, allowing for positive and negative integers.
* Negative integers count back from the last item in the array.
*
* @param index - Index of the item in the Collection to retrieve.
* It can be a relative index from the end of the Collection.
* @returns The item in the Collection stored at the specified index.
* @since 4.23
* @see [Array.prototype.at()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at)
* @example
* // get the layer at the first position
* let firstLayer = map.layers.at(0);
* // get the layer at the last position
* let lastLayer = map.layers.at(-1);
*/
at(index: number): T | undefined;
/**
* Creates a deep clone of the Collection. To create a shallow clone
* of the collection, use [slice()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#slice).
*
* @returns A clone of the Collection that
* invoked this method.
* @see [slice()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#slice)
* @example
* // slides is a clone of the scene slides
* let slides = scene.presentation.slides.clone();
*/
clone(): Collection<T>;
/**
* Creates a new Collection containing the items in the original Collection joined
* with the items in the input array or Collection.
*
* @param value - The array or Collection to append to
* the existing Collection.
* @returns A new Collection comprised of the items in the Collection that
* invoked this method combined with the input items.
* @see [Array.prototype.concat()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)
* @example
* // creating a collection of all the basemap's layers.
* let basemap = map.basemap;
* let basemapLayers = basemap.baseLayers.concat(basemap.referenceLayers);
*/
concat(value: ReadonlyArrayOrCollection<T>): Collection<T>;
/**
* Removes and destroys instances of all the items of the Collection.
*
* @since 4.30
*/
destroyAll(): void;
/**
* Removes each item in the input array and destroys it. If an item is present multiple times in the collection, only the first occurrence is removed and destroyed. The
* [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after an item is removed from the Collection.
*
* @param items - The items to remove and destroy.
* @returns The removed and destroyed items present in the collection.
* @since 4.30
*/
destroyMany(items: ReadonlyArrayOrCollection<T>): T[];
/**
* Removes all the items of the Collection and executes the input function for each item.
*
* @param callback - The function to call for each item in the Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @since 4.33
*/
drain(callback: ItemCallback<T>, thisArg?: any): void;
/**
* Determines whether all items in the Collection pass a test defined by `callback`. Each item
* in the Collection is passed into the callback until one returns a value of `false`.
*
* @param callback - The function to call for each item in the Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns `true` if every call to the `callback` function returned `true`. Returns
* `false` if at least one call to the `callback` returned `false`.
* @see [Array.prototype.every()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)
* @example
* let meetsStandardSize = graphicsLayer.graphics.every(function(item, i){
* // Tests each geometry's area to see if it is greater than 1,000 acres
* return calculateArea(item.geometry) > 1000;
* });
*/
every(callback: ItemTestCallback<T>, thisArg?: any): boolean;
/**
* Filters the Collection's items based on a test defined by the
* `callback` function. Each item is passed into the `callback` function, which
* returns `true` if the item passes the test and `false` if it does not.
*
* @param callback - The function that defines a test for
* determining whether to return the item in a new Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns a new Collection containing the items that passed the filter test.
* @see [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
* @example
* // filteredLayers is a Collection of all the non-visible layers in the map
* let filteredLayers = map.layers.filter(function(layer){
* return !layer.visible;
* });
*/
filter<S extends T>(callback: (item: T, index: number, array: T[]) => item is S, thisArg?: any): Collection<S>;
/**
* Filters the Collection's items based on a test defined by the
* `callback` function. Each item is passed into the `callback` function, which
* returns `true` if the item passes the test and `false` if it does not.
*
* @param callback - The function that defines a test for
* determining whether to return the item in a new Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns a new Collection containing the items that passed the filter test.
* @see [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
* @example
* // filteredLayers is a Collection of all the non-visible layers in the map
* let filteredLayers = map.layers.filter(function(layer){
* return !layer.visible;
* });
*/
filter(callback: ItemTestCallback<T>, thisArg?: any): Collection<T>;
/**
* Returns an item in the Collection if that item passes a test as
* defined in the `callback` function. Each item is passed into the
* `callback` function, which
* returns `true` if the item passes the test and `false` if it does not.
*
* @param callback - The testing function that will assess
* each item in the Collection. Returns `true` if an item passes the test
* and `false` if it fails.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns The first item in the Collection that satisfies the test function.
* @see [Array.prototype.find()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
* @example
* // If the id of a map layer is already known, get the layer that matches the id
* let myLayer = map.layers.find(function(layer){
* return layer.id === "speciesLyr01";
* });
* // myLayer references the layer in map with ID "speciesLyr01"
*/
find(callback: ItemTestCallback<T>, thisArg?: any): T | undefined;
/**
* Returns the index of an item in the Collection if that item passes a test as
* defined in the `callback` function. Each item is passed into the `callback` function, which
* returns `true` if the item passes the test and `false` if it does not.
*
* @param callback - The testing function that will assess each
* item in the Collection. Returns `true` if an item passes the test and
* `false` if it fails.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns the index of the Collection item that satisfies the test function.
* If an item fails the test, `-1` is returned.
* @see [Array.prototype.findIndex()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)
* @example
* // gpcIndex is assigned the index of the first graphic whose name
* // property is 'Redlands'. This result can be used in getItemAt()
* let gpcIndex = graphicsLyr.graphics.findIndex(function(item){
* return item.attributes.name === "Redlands";
* });
*/
findIndex(callback: ItemTestCallback<T>, thisArg?: any): number;
/**
* Flattens a hierarchical Collection containing at least one child collection.
* Each item in the collection is passed into the `callback` function, which
* should check for child collections specified by the developer.
* A flat collection of all items (parent and children) is returned.
*
* This is useful for scenarios where the user would like to search all the layers
* in a map, including a [GroupLayer's layers](https://developers.arcgis.com/javascript/latest/references/core/layers/GroupLayer/#layers)
* and a [MapImageLayer's sublayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#sublayers).
* The callback should return the sub-collection of the item. If multiple levels
* of collections exist in the hierarchy, then this method recursively executes for
* all sub-collections.
*
* @param callback - A function that will assess each item in the Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns a flat collection of all items in the
* original collection and their children.
* @example
* // create a MapImageLayer with several sublayers and add to a map
* // containing another GraphicsLayer
* let layer = new MapImageLayer({ sublayers: [ ... ] });
* let map = new Map({
* layers: [ layer, new GraphicsLayer() ]
* });
*
* // A flat collection of all layers and sublayers
* // (if layer is a MapImageLayer) in the map.
* // This collection may be searched or used for other purposes
* let allLayersAndSublayers = map.layers.flatten(function(item){
* return item.layers || item.sublayers;
* });
*/
flatten(callback: ItemFlattenCallback<T>, thisArg?: any): Collection<T>;
/**
* Flattens a hierarchical Collection containing at least one child collection.
* Each item in the collection is passed into the `callback` function, which
* should check for child collections specified by the developer.
* A flat collection of all items (parent and children) is returned.
*
* This is useful for scenarios where the user would like to search all the layers
* in a map, including a [GroupLayer's layers](https://developers.arcgis.com/javascript/latest/references/core/layers/GroupLayer/#layers)
* and a [MapImageLayer's sublayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#sublayers).
* The callback should return the sub-collection of the item. If multiple levels
* of collections exist in the hierarchy, then this method recursively executes for
* all sub-collections.
*
* @param callback - A function that will assess each item in the Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns a flat collection of all items in the
* original collection and their children.
* @example
* // create a MapImageLayer with several sublayers and add to a map
* // containing another GraphicsLayer
* let layer = new MapImageLayer({ sublayers: [ ... ] });
* let map = new Map({
* layers: [ layer, new GraphicsLayer() ]
* });
*
* // A flat collection of all layers and sublayers
* // (if layer is a MapImageLayer) in the map.
* // This collection may be searched or used for other purposes
* let allLayersAndSublayers = map.layers.flatten(function(item){
* return item.layers || item.sublayers;
* });
*/
flatten<U>(callback: ItemFlattenCallback<U>, thisArg?: any): Collection<U>;
/**
* Executes the input function for each item in the Collection.
*
* @param callback - The function to call for each item in the Collection.
* @param thisArg - Value to use as `this` when executing `callback`.
* @see [Array.prototype.forEach()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
* @example
* graphicsLayer.graphics.forEach(function(item, i){
* // Do something here to each graphic like calculate area of its geometry
* calculateArea(item.geometry);
* });
*/
forEach(callback: ItemCallback<T>, thisArg?: any): void;
/**
* Returns the item at the specified index.
*
* @param index - Zero-based index of the item in the Collection to retrieve.
* @returns The item in the Collection stored at the specified index.
* @example
* // Assigns the base layer at index 0 to baseLayer
* let baseLayer = map.basemap.baseLayers.getItemAt(0);
*/
getItemAt(index: number): T | undefined;
/**
* Tests if an item is present in the new Collection.
*
* @param searchElement - The item to search for in the collection.
* @returns `true` if the item is in the collection.
* @see [Array.prototype.includes()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)
* @example
* // check if a layer is in the map's operational layers.
* if (view.map.layers.includes(myLayer)) {
* // ...
* }
*/
includes(searchElement: T): boolean;
/**
* Returns the index of an element in the collection.
*
* @param searchElement - Item to search for in the collection.
* @param fromIndex - Use if you don't want to search the whole
* collection or you don't want to search from the start.
* @returns The location of the first match found in the collection, or -1 if
* there is no match.
* @see [Array.prototype.indexOf()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
* @example
* // index is the index of the first graphic in the
* // graphics layer that matches the input graphic
* let index = graphicsLayer.graphics.indexOf(graphic);
*/
indexOf(searchElement: T, fromIndex?: number): number;
/**
* Creates a string representation of the items in the Collection.
*
* @param separator - = , - The separator used between each item in the final string.
* @returns The string representation of the items.
* @see [Array.prototype.join()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join)
* @example
* let stringCollection = new Collection(["how", "are", "you", "doing?"]);
* let phrase = stringCollection.join(" ");
*
* // Prints "how are you doing?"
* console.log(phrase);
*/
join(separator?: string): string;
/**
* Returns the last index of an element in the collection.
*
* @param searchElement - Item to search for in the collection.
* @param fromIndex - Use if you don't want to search the whole
* collection, or you don't want to search from the end.
* @returns The location of the last match found in the collection, or -1 if
* there is no match.
* @see [Array.prototype.lastIndexOf()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)
* @example
* // index is the index of the first graphic in the
* // graphics layer that matches the input graphic
* let index = graphicsLayer.graphics.lastIndexOf(graphic);
*/
lastIndexOf(searchElement: T, fromIndex?: number): number;
/**
* Passes each Collection item into the `callback` function and returns a new array of the
* returned values. For example, if you have a Collection of numbers and would like to add each number
* by 10, you can use `map()` to create a new Collection with the same numbers incremented by 10.
*
* @param callback - The function that processes each item
* in the Collection and returns a new value at the same index of the original item.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns a new collection containing the new items
* generated from the `callback`.
* @see [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
* @example
* // Gets the geometries of the graphics and assigns them to a new Collection
* let geometries = graphicsLayer.graphics.map(function(item, i){
* return item.geometry;
* });
*/
map<TRet>(callback: ItemMapCallback<T, TRet>, thisArg?: any): Collection<TRet>;
/**
* Removes the last item from the collection and returns it.
*
* @returns The last item in the collection.
* @see [Array.prototype.pop()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)
* @example
* // Removes the last layer in the map and stores it in lastLayer
* let lastLayer = map.layers.pop();
*/
pop(): T | undefined;
/**
* Adds an item(s) to the end of the collection.
*
* @param items - An item or comma-separated list of items to add to the end of the collection.
* @returns The new length of the collection.
* @see [Array.prototype.push()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
* @example
* // Adds a new graphic to the end of the graphics collection on a GraphicsLayer
* graphicsLyr.graphics.push(newGraphic);
* @example
* // Adds three new graphics to the end of the GraphicsLayer's graphics collection
* graphicsLyr.graphics.push(g1, g2, g3);
*/
push(...items: T[]): number;
/**
* Reduces all items in the collection (from left to right) into a single variable using `callback`.
*
* @param callback - The function that processes each
* item in the Collection and appends it to the previous item.
* @param initialValue - Item to use as the first element to process in `callback`.
* @returns Returns the value representing the reduction of the Collection's items.
* @see [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
* @see [reduceRight()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reduceRight)
*/
reduce<R = T>(callback: ItemReduceCallback<T, R>, initialValue?: R): R;
/**
* Reduces all items in the collection (from right to left) into a single variable using `callback`.
*
* @param callback - The function that processes each
* item in the Collection and appends it to the previous item.
* @param initialValue - Item to use as the first element to process in `callback`.
* @returns Returns the value representing the reduction of the Collection's items.
* @see [Array.prototype.reduceRight()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight)
* @see [reduce()](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reduce)
*/
reduceRight<R = T>(callback: ItemReduceCallback<T, R>, initialValue?: R): R;
/**
* Removes an item from the collection. The [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after an item is removed from the Collection.
*
* @param item - The item to remove.
* @example
* let layer = map.layers.at(4);
* // Removes the fifth layer from the map
* map.layers.remove(layer);
*/
remove(item: T): T | undefined;
/**
* Removes all items from the collection.
*
* @example
* // Removes all layers from the map
* map.layers.removeAll();
*/
removeAll(): T[];
/**
* Removes an item from the collection at a specified index. The [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after an item is removed from the Collection.
*
* @param index - The index of the item to remove.
* @returns The removed item if present in the collection, `undefined` otherwise.
* @example
* // Removes the layer at index 4 of the map
* map.layers.removeAt(4);
*/
removeAt(index: number): T | undefined;
/**
* Removes each item in the input array.
* If an item is present multiple times in the collection, only the first occurrence is removed. The
* [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after an item is removed from the Collection.
*
* @param items - The items to remove.
* @returns The removed items present in the collection.
* @example
* let refLayers = [refLyr1, refLyr2, refLyr3];
* // Removes three reference layers in the refLayers
* // collection from the basemap's referenceLayers
* map.basemap.referenceLayers.removeMany(refLayers);
*/
removeMany(items: ReadonlyArrayOrCollection<T>): T[];
/**
* Moves an item in the Collection to a specified index. The [change event](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#CollectionEvents) is fired after an item is moved in the Collection.
*
* @param item - The item to move.
* @param index - The index to move the item to.
* @returns The item that was moved. `undefined` if `item` is not in the collection
* @example
* // Get the first two layers in a map
* let layer1 = map.layers.at(0);
* let layer2 = map.layers.at(1);
*
* // Moves the second layer to the first position in the map.layers Collection
* // effectively swapping the positions of layer1 and layer2
* map.layers.reorder(layer2, 0);
*/
reorder(item: T, index?: number): T | undefined;
/**
* Reverses the collection in place.
*
* @returns The reversed collection.
* @see [Array.prototype.reverse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)
* @example
* // Reverse layers from the map
* map.layers.reverse();
*/
reverse(): this;
/**
* Removes the first item from the collection (at index 0), and returns it.
* The remaining items of the collection are then shifted down one index from
* their previous location.
*
* @returns The first item in the collection.
* @see [Array.prototype.shift()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
* @example
* // Removes the first layer in the map and stores it in firstLyr
* let firstLyr = map.layers.shift();
*/
shift(): T | undefined;
/**
* Creates a new Collection comprised of a portion of the original Collection.
*
* @param begin - The index of the first item to extract.
* @param end - The index of the last item to extract.
* @returns Returns a new Collection containing the items in the
* specified range.
* @see [Array.prototype.slice()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
* @example
* // get the graphics from index 50 to 100;
* let selection = graphicsLayer.graphics.slice(50, 100);
*/
slice(begin?: number, end?: number): Collection<T>;
/**
* Determines whether an item in the Collection passes a test defined by `callback`. Each item
* in the Collection is passed into the callback until one returns a value of `true`.
*
* @param callback - The function
* that defines the test for each Collection item.
* @param thisArg - Value to use as `this` when executing `callback`.
* @returns Returns `true` if any of the items in the Collection pass the test
* defined in `callback`. Returns `false` if all items fail the test.
* @see [Array.prototype.some()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
* @example
* // If at least one of the point graphics has a geometry whose
* // elevation is above 1000m, then passes will have a value of true.
* // Otherwise, it will be false.
* let passes = graphicsLayer.graphics.some(function(item, i){
* return item.geometry.z > 1000;
* });
*/
some(callback: (item: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
/**
* Sorts the Collection in place.
*
* @param compareFunction - The function that defines
* a comparison of two items in the collection.
* @see [Array.prototype.sort()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
* @example
* // Sort graphics based on their elevation or z-value
* let sortedGraphics = graphicsLayer.graphics.sort(function(a, b){
* if(a.geometry.z > b.geometry.z){
* return 1;
* }
* else if (a.geometry.z < b.geometry.z){
* return -1;
* }
* else {
* return 0;
* }
* });
*/
sort(compareFunction?: ItemCompareCallback<T>): this;
/**
* Removes existing items and/or adds new items to the collection.
*
* @param start - Index at which to start changing the collection.
* @param deleteCount - Indicates the number of collection items to remove.
* If omitted, or if greater than or equal to the number of elements after the position specified by start,
* then all the elements from start to the end will be deleted. If `0` or `undefined` is used, then no
* elements are removed and at least one new item should be added in the `items` parameter.
* @param items - The item or comma-separated list of items to add to the collection.
* @returns An array of the deleted items formerly part of the collection.
* @see [Array.prototype.splice()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
* @example
* // map.layers is a collection of 6 layers
* // Adds a seventh layer to the map at index 3
* map.layers.splice(3, 0, layer7);
* @example
* // Removes two layers starting from index 2 and adds the
* // specified layers in the positions of the former layers
* let oldLayers = map.layers.splice(2, 2, layer8, layer9, layer10);
*
* // oldLayers = [layer2, layer3]
*/
splice(start: number, deleteCount?: number, ...items: T[]): T[];
/**
* Returns a new array object containing the Collection's items.
*
* @returns An array containing the Collection's items.
* @example
* // Creates an array populated with the map's layers
* let mapLayersArray = map.layers.toArray();
*/
toArray(): T[];
toString(): string;
/**
* Adds one or more items to the beginning of the collection.
*
* @param items - The item(s) to add to the beginning of the collection.
* @returns The new length of the collection.
* @see [Array.prototype.unshift()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)
* @example
* // If a map's basemap has 3 baseLayers: baseLyr0, baseLyr1, baseLyr2
* map.basemap.baseLayers.unshift(baseLyr3);
*
* // Now the baseLayers collection is: baseLyr3, baseLyr0, baseLyr1, baseLyr2
*/
unshift(...items: T[]): number;
}
export interface ReadonlyCollection<T> extends EventedMixin, Pick<Collection<T>, "addHandles" | "at" | "clone" | "concat" | "declaredClass" | "destroyed" | "every" | "filter" | "find" | "findIndex" | "flatten" | "forEach" | "getItemAt" | "hasHandles" | "includes" | "initialized" | "indexOf" | "join" | "lastIndexOf" | "map" | "reduce" | "reduceRight" | "removeHandles" | "slice" | "some" | "toArray" | "toString" | "watch" | typeof Symbol.iterator> {
readonly "@eventTypes": Collection<T>["@eventTypes"];
readonly length: number;
}
/**
* The function that is called for each Collection item.
*
* @param item - The current item being assessed in the collection.
* @param index - The index of the item being assessed.
*/
export type ItemCallback<T> = (item: T, index: number) => void;
/**
* @param item - The current item being assessed in the collection.
* @param index - The index of the item being assessed.
*/
export type ItemFlattenCallback<T> = (item: T, index: number) => T[] | Collection<T>;
/**
* The function that defines a test and is called for each Collection item.
*
* @param item - The current item being assessed in the collection.
* @param index - The index of the item being assessed.
* @param array - The entire array of items in the collection.
* @returns true if the test passes, false otherwise.
*/
export type ItemTestCallback<T> = (item: T, index: number, array: T[]) => boolean;
/**
* The function that defines a mapping and is called for each Collection item.
*
* @param item - The current item being assessed in the collection.
* @param index - The index of the item being assessed.
* @returns the new value that replaces item.
*/
export type ItemMapCallback<T, TRet> = (item: T, index: number) => TRet;
/**
* The function that defines a reducer.
*
* @param previousValue - The item previously reduced value.
* @param currentValue - The current item being assessed in the collection.
* @param index - The index of the item being assessed.
* @returns the value to be passed to the next reducer.
*/
export type ItemReduceCallback<T, R> = (previousValue: R, currentValue: T, index: number) => R;
/**
* The function that defines a comparison.
*
* @param firstItem - the first item in the comparison.
* @param secondItem - the second item in the comparison.
* @returns -1 if firstItem is smaller than secondItem, 1 if it is
* larger, and 0 if both are equal.
*/
export type ItemCompareCallback<T> = (firstItem: T, secondItem: T) => number;