root / trunk / web / dojo / dojox / lang / functional / lambda.js
History | View | Annotate | Download (2.03 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
| 3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
| 4 | see: http://dojotoolkit.org/license for details
|
||
| 5 | */
|
||
| 6 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.lang.functional.lambda"]){ |
||
| 9 | dojo._hasResource["dojox.lang.functional.lambda"]=true; |
||
| 10 | dojo.provide("dojox.lang.functional.lambda");
|
||
| 11 | (function(){
|
||
| 12 | var df=dojox.lang.functional,_1={};
|
||
| 13 | var _2="ab".split(/a*/).length>1?String.prototype.split:function(_3){ |
||
| 14 | var r=this.split.call(this,_3),m=_3.exec(this); |
||
| 15 | if(m&&m.index==0){ |
||
| 16 | r.unshift("");
|
||
| 17 | } |
||
| 18 | return r;
|
||
| 19 | }; |
||
| 20 | var _4=function(s){ |
||
| 21 | var _5=[],_6=_2.call(s,/\s*->\s*/m); |
||
| 22 | if(_6.length>1){ |
||
| 23 | while(_6.length){
|
||
| 24 | s=_6.pop(); |
||
| 25 | _5=_6.pop().split(/\s*,\s*|\s+/m);
|
||
| 26 | if(_6.length){
|
||
| 27 | _6.push("(function("+_5+"){return ("+s+")})"); |
||
| 28 | } |
||
| 29 | } |
||
| 30 | }else{
|
||
| 31 | if(s.match(/\b_\b/)){ |
||
| 32 | _5=["_"];
|
||
| 33 | }else{
|
||
| 34 | var l=s.match(/^\s*(?:[+*\/%&|\^\.=<>]|!=)/m),r=s.match(/[+\-*\/%&|\^\.=<>!]\s*$/m); |
||
| 35 | if(l||r){
|
||
| 36 | if(l){
|
||
| 37 | _5.push("$1");
|
||
| 38 | s="$1"+s;
|
||
| 39 | } |
||
| 40 | if(r){
|
||
| 41 | _5.push("$2");
|
||
| 42 | s=s+"$2";
|
||
| 43 | } |
||
| 44 | }else{
|
||
| 45 | var _7=s.replace(/(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|this|true|false|null|undefined|typeof|instanceof|in|delete|new|void|arguments|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|eval|isFinite|isNaN|parseFloat|parseInt|unescape|dojo|dijit|dojox|window|document|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/g,"").match(/([a-z_$][a-z_$\d]*)/gi)||[],t={}; |
||
| 46 | dojo.forEach(_7,function(v){
|
||
| 47 | if(!(v in t)){ |
||
| 48 | _5.push(v); |
||
| 49 | t[v]=1;
|
||
| 50 | } |
||
| 51 | }); |
||
| 52 | } |
||
| 53 | } |
||
| 54 | } |
||
| 55 | return {args:_5,body:s}; |
||
| 56 | }; |
||
| 57 | var _8=function(a){ |
||
| 58 | return a.length?function(){ |
||
| 59 | var i=a.length-1,x=df.lambda(a[i]).apply(this,arguments); |
||
| 60 | for(--i;i>=0;--i){ |
||
| 61 | x=df.lambda(a[i]).call(this,x);
|
||
| 62 | } |
||
| 63 | return x;
|
||
| 64 | }:function(x){
|
||
| 65 | return x;
|
||
| 66 | }; |
||
| 67 | }; |
||
| 68 | dojo.mixin(df,{rawLambda:function(s){
|
||
| 69 | return _4(s);
|
||
| 70 | },buildLambda:function(s){ |
||
| 71 | s=_4(s); |
||
| 72 | return "function("+s.args.join(",")+"){return ("+s.body+");}"; |
||
| 73 | },lambda:function(s){ |
||
| 74 | if(typeof s=="function"){ |
||
| 75 | return s;
|
||
| 76 | } |
||
| 77 | if(s instanceof Array){ |
||
| 78 | return _8(s);
|
||
| 79 | } |
||
| 80 | if(s in _1){ |
||
| 81 | return _1[s];
|
||
| 82 | } |
||
| 83 | s=_4(s); |
||
| 84 | return _1[s]=new Function(s.args,"return ("+s.body+");"); |
||
| 85 | },clearLambdaCache:function(){ |
||
| 86 | _1={};
|
||
| 87 | }}); |
||
| 88 | })(); |
||
| 89 | } |