feat(facade): add maximum method for ListWrapper

This commit is contained in:
Brian Ford 2015-08-13 11:19:37 -07:00
parent 5c95b376b5
commit b5c4d8ba79
3 changed files with 56 additions and 1 deletions

View File

@ -217,6 +217,27 @@ class ListWrapper {
if (end == null) return len; if (end == null) return len;
return end < 0 ? max(len + end, 0) : min(end, 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; bool isListLikeIterable(obj) => obj is Iterable;

View File

@ -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 List = global.Array;
export var Map = global.Map; export var Map = global.Map;
@ -266,6 +266,26 @@ export class ListWrapper {
} }
static toString<T>(l: List<T>): string { return l.toString(); } static toString<T>(l: List<T>): string { return l.toString(); }
static toJSON<T>(l: List<T>): string { return JSON.stringify(l); } static toJSON<T>(l: List<T>): string { return JSON.stringify(l); }
static maximum<T>(list: List<T>, 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 { export function isListLikeIterable(obj: any): boolean {

View File

@ -76,6 +76,20 @@ export function main() {
it('should respect the startIndex parameter', it('should respect the startIndex parameter',
() => { expect(ListWrapper.indexOf(l, 1, 1)).toEqual(-1); }); () => { 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', () => { describe('StringMapWrapper', () => {