Security:Strawman Model: Difference between revisions
Jump to navigation
Jump to search
(User:Brendan moved to XPConnect:Security:XPCNativeWrapper Automation) |
No edit summary |
||
| Line 1: | Line 1: | ||
</code> | |||
$ cat Iterator.js | |||
function Iterator() { | |||
var i = arguments.length; | |||
if (i < 0 && 2 < i) | |||
throw TypeError("Iterator requires 0 to 2 arguments"); | |||
function generic_next() { return this(); }; | |||
var arg0 = arguments[0]; | |||
if (arg0 && typeof arg0 == "object") { | |||
if (i == 2 && typeof arg0 == "function") { | |||
var callable = arg0; | |||
var sentinel = arguments[1]; | |||
var last; | |||
function funiter() { | |||
last = callable(); | |||
if (last == sentinel) | |||
throw "StopIteration"; | |||
return last; | |||
} | |||
funiter.next = generic_next; | |||
funiter.done = function () { return last == sentinel; }; | |||
return funiter; | |||
} | |||
var keys = []; | |||
for (i in arg0) | |||
keys.push(i); | |||
i = 0; | |||
function objiter() { | |||
if (i == keys.length) | |||
throw "StopIteration"; | |||
return keys[i++]; | |||
} | |||
objiter.next = generic_next; | |||
objiter.done = function () { return i == keys.length; }; | |||
return objiter; | |||
} | |||
var end, start = 0, step = 1; | |||
i = 0; | |||
switch (arguments.length) { | |||
case 3: | |||
step = Number(arguments[2]); | |||
case 2: | |||
start = Number(arg0), i = 1; | |||
case 1: | |||
end = Number(arguments[i]); | |||
break; | |||
} | |||
i = start; | |||
function iter() { | |||
if (i == end) | |||
throw "StopIteration"; | |||
var j = i; | |||
i += step; | |||
return j; | |||
} | |||
iter.next = generic_next; | |||
iter.done = function () { return i == end; }; | |||
return iter; | |||
} | |||
</code> | |||
Revision as of 06:13, 24 September 2005
$ cat Iterator.js function Iterator() {
var i = arguments.length;
if (i < 0 && 2 < i)
throw TypeError("Iterator requires 0 to 2 arguments");
function generic_next() { return this(); };
var arg0 = arguments[0];
if (arg0 && typeof arg0 == "object") {
if (i == 2 && typeof arg0 == "function") {
var callable = arg0;
var sentinel = arguments[1];
var last;
function funiter() {
last = callable();
if (last == sentinel)
throw "StopIteration";
return last;
}
funiter.next = generic_next;
funiter.done = function () { return last == sentinel; };
return funiter;
}
var keys = [];
for (i in arg0)
keys.push(i);
i = 0;
function objiter() {
if (i == keys.length)
throw "StopIteration";
return keys[i++];
}
objiter.next = generic_next;
objiter.done = function () { return i == keys.length; };
return objiter;
}
var end, start = 0, step = 1;
i = 0;
switch (arguments.length) {
case 3:
step = Number(arguments[2]);
case 2:
start = Number(arg0), i = 1;
case 1:
end = Number(arguments[i]);
break;
}
i = start;
function iter() {
if (i == end)
throw "StopIteration";
var j = i;
i += step;
return j;
}
iter.next = generic_next;
iter.done = function () { return i == end; };
return iter;
}