| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574 |
- var $builtinmodule = function (name) {
- var mod = {};
- // defaultdict object
- mod.defaultdict = function defaultdict(default_, args) {
- if (!(this instanceof mod.defaultdict)) {
- return new mod.defaultdict(default_, args);
- }
- Sk.abstr.superConstructor(mod.defaultdict, this, args);
- if (default_ === undefined) {
- this.default_factory = Sk.builtin.none.none$;
- }
- else {
- if (!Sk.builtin.checkCallable(default_) && !(default_ instanceof Sk.builtin.none)) {
- throw new Sk.builtin.TypeError("first argument must be callable");
- }
- this.default_factory = default_;
- }
- if (this['$d']) {
- this['$d']['default_factory'] = this.default_factory;
- }
- else {
- this['$d'] = {'default_factory': this.default_factory};
- }
- return this;
- };
- Sk.abstr.setUpInheritance("defaultdict", mod.defaultdict, Sk.builtin.dict);
- mod.defaultdict.prototype['$r'] = function () {
- var def_str = Sk.misceval.objectRepr(this.default_factory).v;
- var dict_str = Sk.builtin.dict.prototype['$r'].call(this).v;
- return new Sk.builtin.str("defaultdict(" + def_str + ", " + dict_str + ")");
- };
- mod.defaultdict.prototype['__missing__'] = function (key) {
- Sk.builtin.pyCheckArgs('__missing__', arguments, 0, 1);
- if (key) {
- throw new Sk.builtin.KeyError(Sk.misceval.objectRepr(key));
- }
- else {
- return Sk.misceval.callsim(this.default_factory);
- }
- };
- mod.defaultdict.prototype.mp$subscript = function (key) {
- try {
- return Sk.builtin.dict.prototype.mp$subscript.call(this, key);
- }
- catch (e) {
- if (this.default_factory instanceof Sk.builtin.none) {
- return this.__missing__(key);
- }
- else {
- ret = this.__missing__();
- this.mp$ass_subscript(key, ret);
- return ret;
- }
- }
- };
- // Counter object
- mod.Counter = function Counter(iter_or_map) {
- if (!(this instanceof mod.Counter)) {
- return new mod.Counter(iter_or_map);
- }
- if (iter_or_map instanceof Sk.builtin.dict || iter_or_map === undefined) {
- Sk.abstr.superConstructor(mod.Counter, this, iter_or_map);
- }
- else {
- if (!(Sk.builtin.checkIterable(iter_or_map))) {
- throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(iter_or_map) + "' object is not iterable");
- }
- Sk.abstr.superConstructor(mod.Counter, this);
- var one = new Sk.builtin.int_(1);
- for (var iter = iter_or_map.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- var count = this.mp$subscript(k);
- count = count.nb$add(one);
- this.mp$ass_subscript(k, count);
- }
- }
- return this;
- };
- Sk.abstr.setUpInheritance("Counter", mod.Counter, Sk.builtin.dict);
- mod.Counter.prototype['$r'] = function () {
- var dict_str = this.size > 0 ? Sk.builtin.dict.prototype['$r'].call(this).v : '';
- return new Sk.builtin.str('Counter(' + dict_str + ')');
- };
- mod.Counter.prototype.mp$subscript = function (key) {
- try {
- return Sk.builtin.dict.prototype.mp$subscript.call(this, key);
- }
- catch (e) {
- return new Sk.builtin.int_(0);
- }
- };
- mod.Counter.prototype['elements'] = new Sk.builtin.func(function (self) {
- Sk.builtin.pyCheckArgs('elements', arguments, 1, 1);
- var all_elements = [];
- for (var iter = self.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- for (var i = 0; i < self.mp$subscript(k).v; i++) {
- all_elements.push(k);
- }
- }
- var ret =
- {
- tp$iter: function () {
- return ret;
- },
- $obj: this,
- $index: 0,
- $elem: all_elements,
- tp$iternext: function () {
- if (ret.$index >= ret.$elem.length) {
- return undefined;
- }
- return ret.$elem[ret.$index++];
- }
- };
- return ret;
- });
- mod.Counter.prototype['most_common'] = new Sk.builtin.func(function (self, n) {
- Sk.builtin.pyCheckArgs('most_common', arguments, 1, 2);
- var length = self.mp$length();
- if (n === undefined) {
- n = length;
- }
- else {
- if (!Sk.builtin.checkInt(n)) {
- if (n instanceof Sk.builtin.float_) {
- throw new Sk.builtin.TypeError("integer argument expected, got float");
- }
- else {
- throw new Sk.builtin.TypeError("an integer is required");
- }
- }
- n = Sk.builtin.asnum$(n);
- n = n <= length ? n : length;
- n = n >= 0 ? n : 0;
- }
- var most_common_elem = [];
- for (var iter = self.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- most_common_elem.push([k, self.mp$subscript(k)]);
- }
- var sort_func = function (a, b) {
- if (a[1].v < b[1].v) {
- return 1;
- } else if (a[1].v > b[1].v) {
- return -1;
- } else {
- return 0;
- }
- };
- most_common_elem = most_common_elem.sort(sort_func);
- var ret = [];
- for (var i = 0; i < n; i++) {
- ret.push(new Sk.builtin.tuple(most_common_elem.shift()));
- }
- return new Sk.builtin.list(ret);
- });
- mod.Counter.prototype['update'] = new Sk.builtin.func(function (self, other) {
- Sk.builtin.pyCheckArgs('update', arguments, 1, 2);
- if (other instanceof Sk.builtin.dict) {
- for (var iter = other.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- var count = self.mp$subscript(k);
- self.mp$ass_subscript(k, count.nb$add(other.mp$subscript(k)));
- }
- }
- else if (other !== undefined) {
- if (!Sk.builtin.checkIterable(other)) {
- throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(other) + "' object is not iterable");
- }
- var one = new Sk.builtin.int_(1);
- for (var iter = other.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- var count = self.mp$subscript(k);
- self.mp$ass_subscript(k, count.nb$add(one));
- }
- }
- });
- mod.Counter.prototype['subtract'] = new Sk.builtin.func(function (self, other) {
- Sk.builtin.pyCheckArgs('subtract', arguments, 1, 2);
- if (other instanceof Sk.builtin.dict) {
- for (var iter = other.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- var count = self.mp$subscript(k);
- self.mp$ass_subscript(k, count.nb$subtract(other.mp$subscript(k)));
- }
- }
- else if (other !== undefined) {
- if (!Sk.builtin.checkIterable(other)) {
- throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(other) + "' object is not iterable");
- }
- var one = new Sk.builtin.int_(1);
- for (var iter = other.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- var count = self.mp$subscript(k);
- self.mp$ass_subscript(k, count.nb$subtract(one));
- }
- }
- });
- // OrderedDict
- mod.OrderedDict = function OrderedDict(items)
- {
- if (!(this instanceof mod.OrderedDict))
- {
- return new mod.OrderedDict(items);
- }
- this.orderedkeys = [];
- Sk.abstr.superConstructor(mod.OrderedDict, this, items);
- return this;
- }
- Sk.abstr.setUpInheritance("OrderedDict", mod.OrderedDict, Sk.builtin.dict);
- mod.OrderedDict.prototype['$r'] = function()
- {
- var v;
- var iter, k;
- var ret = [];
- var pairstr;
- for (iter = this.tp$iter(), k = iter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext()) {
- v = this.mp$subscript(k);
- if (v === undefined) {
- //print(k, "had undefined v");
- v = null;
- }
- ret.push("(" + Sk.misceval.objectRepr(k).v + ", " + Sk.misceval.objectRepr(v).v + ")");
- }
- pairstr = ret.join(", ");
- if (ret.length > 0)
- {
- pairstr = "[" + pairstr + "]";
- }
- return new Sk.builtin.str("OrderedDict(" + pairstr + ")");
- }
- mod.OrderedDict.prototype.mp$ass_subscript = function(key, w)
- {
- var idx = this.orderedkeys.indexOf(key);
- if (idx == -1)
- {
- this.orderedkeys.push(key);
- }
- return Sk.builtin.dict.prototype.mp$ass_subscript.call(this, key, w);
- }
- mod.OrderedDict.prototype.mp$del_subscript = function(key)
- {
- var idx = this.orderedkeys.indexOf(key);
- if (idx != -1)
- {
- this.orderedkeys.splice(idx, 1);
- }
- return Sk.builtin.dict.prototype.mp$del_subscript.call(this, key);
- }
- mod.OrderedDict.prototype.__iter__ = new Sk.builtin.func(function (self) {
- Sk.builtin.pyCheckArgs("__iter__", arguments, 0, 0, false, true);
- return mod.OrderedDict.prototype.tp$iter.call(self);
- });
- mod.OrderedDict.prototype.tp$iter = function()
- {
- var ret;
- ret =
- {
- tp$iter : function () {
- return ret;
- },
- $obj : this,
- $index : 0,
- $keys : this.orderedkeys.slice(0),
- tp$iternext: function () {
- // todo; StopIteration
- if (ret.$index >= ret.$keys.length) {
- return undefined;
- }
- return ret.$keys[ret.$index++];
- }
- };
- return ret;
- }
- mod.OrderedDict.prototype.ob$eq = function (other) {
- var l;
- var otherl;
- var iter;
- var k;
- var v;
- if (!(other instanceof mod.OrderedDict))
- {
- return Sk.builtin.dict.prototype.ob$eq.call(this, other);
- }
- l = this.mp$length();
- otherl = other.mp$length();
- if (l !== otherl) {
- return Sk.builtin.bool.false$;
- }
- for (iter = this.tp$iter(), otheriter = other.tp$iter(),
- k = iter.tp$iternext(), otherk = otheriter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext(), otherk = otheriter.tp$iternext())
- {
- if (!Sk.misceval.isTrue(Sk.misceval.richCompareBool(k, otherk, "Eq")))
- {
- return Sk.builtin.bool.false$;
- }
- v = this.mp$subscript(k);
- otherv = other.mp$subscript(otherk);
- if (!Sk.misceval.isTrue(Sk.misceval.richCompareBool(v, otherv, "Eq"))) {
- return Sk.builtin.bool.false$;
- }
- }
- return Sk.builtin.bool.true$;
- };
- mod.OrderedDict.prototype.ob$ne = function (other) {
- var l;
- var otherl;
- var iter;
- var k;
- var v;
- if (!(other instanceof mod.OrderedDict))
- {
- return Sk.builtin.dict.prototype.ob$ne.call(this, other);
- }
- l = this.size;
- otherl = other.size;
- if (l !== otherl) {
- return Sk.builtin.bool.true$;
- }
- for (iter = this.tp$iter(), otheriter = other.tp$iter(),
- k = iter.tp$iternext(), otherk = otheriter.tp$iternext();
- k !== undefined;
- k = iter.tp$iternext(), otherk = otheriter.tp$iternext())
- {
- if (!Sk.misceval.isTrue(Sk.misceval.richCompareBool(k, otherk, "Eq")))
- {
- return Sk.builtin.bool.true$;
- }
- v = this.mp$subscript(k);
- otherv = other.mp$subscript(otherk);
- if (!Sk.misceval.isTrue(Sk.misceval.richCompareBool(v, otherv, "Eq"))) {
- return Sk.builtin.bool.true$;
- }
- }
- return Sk.builtin.bool.false$;
- };
- mod.OrderedDict.prototype["pop"] = new Sk.builtin.func(function (self, key, d) {
- var s;
- var idx;
- Sk.builtin.pyCheckArgs('pop', arguments, 2, 3);
- idx = self.orderedkeys.indexOf(key);
- if (idx != -1)
- {
- self.orderedkeys.splice(idx, 1);
- }
- return Sk.misceval.callsim(Sk.builtin.dict.prototype["pop"], self, key, d);
- });
- mod.OrderedDict.prototype["popitem"] = new Sk.builtin.func(function (self, last) {
- var key, val;
- var s;
- Sk.builtin.pyCheckArgs('popitem', arguments, 1, 2);
- // Empty dictionary
- if (self.orderedkeys.length == 0)
- {
- s = new Sk.builtin.str('dictionary is empty');
- throw new Sk.builtin.KeyError(s.v);
- }
- key = self.orderedkeys[0];
- if (last === undefined || Sk.misceval.isTrue(last))
- {
- key = self.orderedkeys[self.orderedkeys.length - 1];
- }
- val = Sk.misceval.callsim(self["pop"], self, key);
- return Sk.builtin.tuple([key, val]);
- });
- // deque
- mod.deque = function deque(iterable, maxlen) {
- throw new Sk.builtin.NotImplementedError("deque is not implemented")
- };
- // namedtuple
- mod.namedtuples = {};
- var keywds = Sk.importModule("keyword", false, false);
- // should cover most things. Does not:
- // * keyword args
- // _make
- // _replace
- // _asdict
- // _fields
- var hasDupes = function(a) {
- var counts = [];
- for(var i = 0; i <= a.length; i++) {
- if(counts[a[i]] === undefined) {
- counts[a[i]] = 1;
- } else {
- return true;
- }
- }
- return false;
- }
- var Skinherits = function(childCtor, parentCtor) {
- /** @constructor */
- function tempCtor() {};
- tempCtor.prototype = parentCtor.prototype;
- childCtor.superClass_ = parentCtor.prototype;
- childCtor.prototype = new tempCtor();
- /** @override */
- childCtor.prototype.constructor = childCtor;
- };
- mod.namedtuple = function (name, fields) {
- if (Sk.ffi.remapToJs(Sk.misceval.callsim(keywds.$d['iskeyword'],name ))) {
- throw new Sk.builtin.ValueError("Type names and field names cannot be a keyword: " + name.v);
- }
- var nm = Sk.ffi.remapToJs(name);
- startsw = new RegExp(/^[0-9].*/);
- startsw2 = new RegExp(/^[0-9_].*/);
- alnum = new RegExp(/^\w*$/);
- if (startsw.test(nm) || (! alnum.test(nm))) {
- throw new Sk.builtin.ValueError(" Bad type name " + nm);
- }
- // fields could be a string or a tuple or list of strings
- var flds = Sk.ffi.remapToJs(fields);
- if (typeof(flds) === 'string') {
- flds = flds.split(/\s+/);
- }
- // import the keyword module here and use iskeyword
- for (i = 0; i < flds.length; i++) {
- if (Sk.ffi.remapToJs(Sk.misceval.callsim(keywds.$d['iskeyword'],Sk.ffi.remapToPy(flds[i]))) ||
- startsw2.test(flds[i]) || (! alnum.test(flds[i]))
- ) {
- throw new Sk.builtin.ValueError("Type names and field names cannot be a keyword: " + flds[i]);
- }
- }
- if (hasDupes(flds)) {
- throw new Sk.builtin.ValueError("Field names must be unique.");
- }
- var cons = function nametuple_constructor() {
- var o;
- if (arguments.length !== flds.length ) {
- throw new Sk.builtin.TypeError("Number of arguments must match");
- }
- if (!(this instanceof mod.namedtuples[nm])) {
- o = Object.create(mod.namedtuples[nm].prototype);
- o.constructor.apply(o, arguments);
- return o;
- }
- this.__class__ = mod.namedtuples[nm];
- this.v = Array.prototype.slice.call(arguments);
- };
- mod.namedtuples[nm] = cons;
- Skinherits(cons, Sk.builtin.tuple);
- cons.prototype.tp$name = nm;
- cons.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj(nm, mod.namedtuples[nm]);
- cons.prototype["$r"] = function () {
- var ret;
- var i;
- var bits;
- if (this.v.length === 0) {
- return new Sk.builtin.str(nm + "()");
- }
- bits = [];
- for (i = 0; i < this.v.length; ++i) {
- bits[i] = flds[i] + "=" + Sk.misceval.objectRepr(this.v[i]).v;
- }
- ret = bits.join(", ");
- if (this.v.length === 1) {
- ret += ",";
- }
- return new Sk.builtin.str(nm + "(" + ret + ")");
- };
- cons.prototype.tp$getattr = function (name) {
- var i = flds.indexOf(name);
- if (i >= 0) {
- return this.v[i];
- }
- return undefined;
- };
- cons.prototype.tp$setattr = function (name, value) {
- throw new Sk.builtin.AttributeError("can't set attribute");
- };
- return cons;
- };
- return mod;
- };
|