diff --git a/modules/angular2/src/facade/collection.dart b/modules/angular2/src/facade/collection.dart index cdbfdf9d48..c2766d509b 100644 --- a/modules/angular2/src/facade/collection.dart +++ b/modules/angular2/src/facade/collection.dart @@ -217,6 +217,27 @@ class ListWrapper { if (end == null) return len; return end < 0 ? max(len + end, 0) : min(end, len); } + + + static maximum(List l, fn(item)) { + if (l.length == 0) { + return null; + } + var solution = null; + var maxValue = double.NEGATIVE_INFINITY; + for (var index = 0; index < l.length; index++) { + var candidate = l[index]; + if (candidate == null) { + continue; + } + var candidateValue = fn(candidate); + if (candidateValue > maxValue) { + solution = candidate; + maxValue = candidateValue; + } + } + return solution; + } } bool isListLikeIterable(obj) => obj is Iterable; diff --git a/modules/angular2/src/facade/collection.ts b/modules/angular2/src/facade/collection.ts index 97b6d8ef9f..b09e4f9ecd 100644 --- a/modules/angular2/src/facade/collection.ts +++ b/modules/angular2/src/facade/collection.ts @@ -1,4 +1,4 @@ -import {isJsObject, global, isPresent, isArray} from 'angular2/src/facade/lang'; +import {isJsObject, global, isPresent, isBlank, isArray} from 'angular2/src/facade/lang'; export var List = global.Array; export var Map = global.Map; @@ -266,6 +266,26 @@ export class ListWrapper { } static toString(l: List): string { return l.toString(); } static toJSON(l: List): string { return JSON.stringify(l); } + + static maximum(list: List, predicate: (T) => number): T { + if (list.length == 0) { + return null; + } + var solution = null; + var maxValue = -Infinity; + for (var index = 0; index < list.length; index++) { + var candidate = list[index]; + if (isBlank(candidate)) { + continue; + } + var candidateValue = predicate(candidate); + if (candidateValue > maxValue) { + solution = candidate; + maxValue = candidateValue; + } + } + return solution; + } } export function isListLikeIterable(obj: any): boolean { diff --git a/modules/angular2/test/facade/collection_spec.ts b/modules/angular2/test/facade/collection_spec.ts index 7795d45b76..2d0a5ed578 100644 --- a/modules/angular2/test/facade/collection_spec.ts +++ b/modules/angular2/test/facade/collection_spec.ts @@ -76,6 +76,20 @@ export function main() { it('should respect the startIndex parameter', () => { expect(ListWrapper.indexOf(l, 1, 1)).toEqual(-1); }); }); + + describe('maximum', () => { + it('should return the maximal element', + () => { expect(ListWrapper.maximum([1, 2, 3, 4], x => x)).toEqual(4); }); + + it('should ignore null values', + () => { expect(ListWrapper.maximum([null, 2, 3, null], x => x)).toEqual(3); }); + + it('should use the provided function to determine maximum', + () => { expect(ListWrapper.maximum([1, 2, 3, 4], x => -x)).toEqual(1); }); + + it('should return null for an empty list', + () => { expect(ListWrapper.maximum([], x => x)).toEqual(null); }); + }); }); describe('StringMapWrapper', () => {