root / trunk / web / dojo / dojox / lang / functional / lambda.js @ 9
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 | } |