iter.js

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");