123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.lang.functional.scan"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.lang.functional.scan"] = true;
- dojo.provide("dojox.lang.functional.scan");
- dojo.require("dojox.lang.functional.lambda");
- // This module adds high-level functions and related constructs:
- // - "scan" family of functions
- // Notes:
- // - missing high-level functions are provided with the compatible API:
- // scanl, scanl1, scanr, scanr1
- // Defined methods:
- // - take any valid lambda argument as the functional argument
- // - operate on dense arrays
- // - take a string as the array argument
- // - take an iterator objects as the array argument (only scanl, and scanl1)
- (function(){
- var d = dojo, df = dojox.lang.functional, empty = {};
- d.mixin(df, {
- // classic reduce-class functions
- scanl: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){
- // summary: repeatedly applies a binary function to an array from left
- // to right using a seed value as a starting point; returns an array
- // of values produced by foldl() at that point.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var t, n, i;
- if(d.isArray(a)){
- // array
- t = new Array((n = a.length) + 1);
- t[0] = z;
- for(i = 0; i < n; z = f.call(o, z, a[i], i, a), t[++i] = z);
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- t = [z];
- for(i = 0; a.hasNext(); t.push(z = f.call(o, z, a.next(), i++, a)));
- }else{
- // object/dictionary
- t = [z];
- for(i in a){
- if(!(i in empty)){
- t.push(z = f.call(o, z, a[i], i, a));
- }
- }
- }
- return t; // Array
- },
- scanl1: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: repeatedly applies a binary function to an array from left
- // to right; returns an array of values produced by foldl1() at that
- // point.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var t, n, z, first = true;
- if(d.isArray(a)){
- // array
- t = new Array(n = a.length);
- t[0] = z = a[0];
- for(var i = 1; i < n; t[i] = z = f.call(o, z, a[i], i, a), ++i);
- }else if(typeof a.hasNext == "function" && typeof a.next == "function"){
- // iterator
- if(a.hasNext()){
- t = [z = a.next()];
- for(var i = 1; a.hasNext(); t.push(z = f.call(o, z, a.next(), i++, a)));
- }
- }else{
- // object/dictionary
- for(var i in a){
- if(!(i in empty)){
- if(first){
- t = [z = a[i]];
- first = false;
- }else{
- t.push(z = f.call(o, z, a[i], i, a));
- }
- }
- }
- }
- return t; // Array
- },
- scanr: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){
- // summary: repeatedly applies a binary function to an array from right
- // to left using a seed value as a starting point; returns an array
- // of values produced by foldr() at that point.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var n = a.length, t = new Array(n + 1), i = n;
- t[n] = z;
- for(; i > 0; --i, z = f.call(o, z, a[i], i, a), t[i] = z);
- return t; // Array
- },
- scanr1: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
- // summary: repeatedly applies a binary function to an array from right
- // to left; returns an array of values produced by foldr1() at that
- // point.
- if(typeof a == "string"){ a = a.split(""); }
- o = o || d.global; f = df.lambda(f);
- var n = a.length, t = new Array(n), z = a[n - 1], i = n - 1;
- t[i] = z;
- for(; i > 0; --i, z = f.call(o, z, a[i], i, a), t[i] = z);
- return t; // Array
- }
- });
- })();
- }
|