sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
69 lines (61 loc) • 2.08 kB
JavaScript
Sk.builtin.sorted = function sorted (iterable, cmp, key, reverse) {
var arr;
var next;
var iter;
var compare_func;
var list;
var rev;
if (reverse === undefined) {
rev = false;
} else if (reverse instanceof Sk.builtin.float_) {
throw new Sk.builtin.TypeError("an integer is required, got float");
} else if (reverse instanceof Sk.builtin.int_ || reverse.prototype instanceof Sk.builtin.int_) {
rev = Sk.misceval.isTrue(reverse);
} else {
throw new Sk.builtin.TypeError("an integer is required");
}
if (key !== undefined && !(key instanceof Sk.builtin.none)) {
if (cmp instanceof Sk.builtin.none || cmp === undefined) {
compare_func = function (a, b) {
return Sk.misceval.richCompareBool(a[0], b[0], "Lt") ? new Sk.builtin.int_(-1) : new Sk.builtin.int_(0);
};
} else {
compare_func = function (a, b) {
return Sk.misceval.callsim(cmp, a[0], b[0]);
};
}
iter = iterable.tp$iter();
next = iter.tp$iternext();
arr = [];
while (next !== undefined) {
arr.push([Sk.misceval.callsim(key, next), next]);
next = iter.tp$iternext();
}
list = new Sk.builtin.list(arr);
} else {
if (!(cmp instanceof Sk.builtin.none) && cmp !== undefined) {
compare_func = cmp;
}
list = new Sk.builtin.list(iterable);
}
if (compare_func !== undefined) {
list.list_sort_(list, compare_func);
} else {
list.list_sort_(list);
}
if (rev) {
list.list_reverse_(list);
}
if (key !== undefined && !(key instanceof Sk.builtin.none)) {
iter = list.tp$iter();
next = iter.tp$iternext();
arr = [];
while (next !== undefined) {
arr.push(next[1]);
next = iter.tp$iternext();
}
list = new Sk.builtin.list(arr);
}
return list;
};
/* NOTE: See constants used for kwargs in constants.js */