fix(collection): new Set(iterable) is not supported (IE11, Safari)

Closes #2063
This commit is contained in:
Marc Laval 2015-05-21 18:18:19 +02:00
parent b1c9bf14b2
commit 57b88ec2d6
1 changed files with 20 additions and 1 deletions

View File

@ -233,7 +233,26 @@ export function iterateListLike(obj, fn: Function) {
} }
} }
// Safari and Internet Explorer do not support the iterable parameter to the
// Set constructor. We work around that by manually adding the items.
var createSetFromList: {(lst: List<any>): Set<any>} = (function() {
var test = new Set([1, 2, 3]);
if (test.size === 3) {
return function createSetFromList(lst: List<any>): Set<any> { return new Set(lst); };
} else {
return function createSetAndPopulateFromList(lst: List<any>): Set<any> {
var res = new Set(lst);
if (res.size !== lst.length) {
for (var i = 0; i < lst.length; i++) {
res.add(lst[i]);
}
}
return res;
};
}
})();
export class SetWrapper { export class SetWrapper {
static createFromList<T>(lst: List<T>): Set<T> { return new Set(lst); } static createFromList<T>(lst: List<T>): Set<T> { return createSetFromList(lst); }
static has<T>(s: Set<T>, key: T): boolean { return s.has(key); } static has<T>(s: Set<T>, key: T): boolean { return s.has(key); }
} }