imap

コードを読む。

function (fun, p, q) {
    var m = MochiKit.Base;
    var self = MochiKit.Iter;
    var iterables = m.map(self.iter, m.extend(null, arguments, 1));
    var map = m.map;
    var next = self.next;
    return {repr:function () {
        return "imap(...)";
    }, toString:m.forwardCall("repr"), next:function () {
        return fun.apply(this, map(next, iterables));
    }};
}

なんでlist()じゃなくてextend()なんだろう…と思ったら、スキップしたいからか。
えーっと、引数に対してfuncを適用して、イテレータをつくる?
引数個々をイテレータに変換する。と
こんなかんじか…

js> forEach(imap(function(i, j, k) { return (i * j * k) }, [1, 2, 3], [10,11], [100, 200, 300]), function(i) { print(i) })})

行列の計算みたい。(いろいろ違うけど)
引数で一番短いイテレータの長さにそろうのは、forEachで例外をキャッチしているせいか。