Provides functional iteration in javascript
// :depends yui-base
// :copyright (c) 2009 by Iain Lamb, All Rights Reserved
// :license http://lamb.cc/license/bsd.txt
// Each method applies a function to the items in a series.
// Evaluation is similar to the || opertator:
// Return the first true value encountered.
// (Stop further iteration at that point)
// Designed to be used with yui3, but any of the Y.iter
// methods may be cut/pasted out and used ala carte.
YUI().add('iter', function (Y) {
Y.iter = {
each : function (seq, f) {
// Iterate over each ith item in seq,
// evaluate f(seq[i]) and assign
// the result to v. If v is a true
// value, stop iteration and return it.
// Consider a sequence type seq to be an Array or
// like one: it must have a .length property and
// its members must be available via index numbers,
// e.g. seq[0] ... seq[n]
var i, v;
for (i = 0; i < seq.length; i++) {
v = f(seq[i]);
if (v) return v;
}
},
enumerate : function(seq, f, start) {
// Iterate over each ith item in seq,
// evaluate f(start + i, seq[i]) and
// assign the result to v. If v is
// a true value, stop iteration and
// return it.
// Similar to Python's enumerate
var i, v;
if (!start) start = 0;
for (i = 0; i < seq.length; i++) {
v = f(i + start, seq[i]);
if (v) return v;
}
},
keys : function(o, f) {
// Iterate over each property k in object o
// such that o.hasOwnProperty() is true.
// For each such k, evaluate f(k) and
// assign the result to v. If v is a true
// value, stop iteration and return v.
// Similar to Python's keys()
var k,v;
for (k in o) {
if (o.hasOwnProperty(k)) {
v = f(k);
if (v) return v; // break
}
}
},
values : function(o, f) {
// Iterate over each property k in object o
// such that o.hasOwnProperty() is true.
// For each such k, evaluate f(o[k]) and
// assign the result to v. If v is a true
// value, stop iteration and return v.
// Similar to Python's values()
var k,v;
for (k in o) {
if (o.hasOwnProperty(k)) {
v = f(o[k]);
if (v) return v; // break
}
}
},
items : function(o, f) {
// Iterate over each property k in object o
// such that o.hasOwnProperty() is true.
// For each such k, evaluate f(k, o[k]):
// assign the result to v. If v is a true
// value, stop iteration and return v.
// Similar to Python's items()
var k,v;
for (k in o) {
if (o.hasOwnProperty(k)) {
v = f(k, o[k]);
if (v) return v; // break
}
}
}
};
}, "1.0.0");