Advertisement
Guest User

Untitled

a guest
Jul 30th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*******************************************************************************
  2.  
  3. worldtimestreamコンポーネント
  4.  
  5.   コンポーネントは、worldtimestream Function オブジェクト(以下wtfとします)をエク
  6. スポートします。CommonJS(module.exports)に未対応の環境で読み込んだ場合、グローバ
  7. ルなコンテキストのthis.___ にコンポーネントが格納されます。
  8.  
  9.   var wtf = require('worldtimestream');
  10.   console.log( typeof wtf ); // => "function"
  11.  
  12.     また、Object.prototypeを拡張し、ObjectにargumentNamesメソッドを追加します。
  13.  
  14.   wtfの呼び出し
  15.  
  16.   1.  引数としてFunctionオブジェクトを渡し、wtf を呼び出した場合、渡された関数オ
  17.       ブジェクトを、Date.nowを第一引数として渡しコールバックします。
  18.  
  19.       wtf(function(x){
  20.         console.log( x === Date.now ); // => "true"
  21.       });
  22.  
  23.        この時、wtfは渡されたFunction オブジェクトの第一引数の名前を記憶します。
  24.      第一引数がない場合、't'を格納します。上記の例では 'x'となります。なお、引数
  25.      の名前切り出しは、Prototype.jsのargumentNamesと同一の仕様です。
  26.        二回目以降、このFunctionオブジェクトを渡すwtfの呼び出しを実行した場合、例
  27.      外がスローされます。
  28.  
  29.   2.  1以外の場合、wtfはObject オブジェクト (以下wtf-objectとします)を返します。
  30.         この時、wtf-objectには、1.で記憶した第一引数の名前をキーとして、内部状態
  31.       取得メソッドが追加されます。1を実行する前に2を実行した場合、メソッド名は不
  32.       定です。
  33.  
  34.   wtfのプロパティ、メソッド
  35.  
  36.     worldプロパティ
  37.         書き込み専用のプロパティです。Functionオブジェクトを代入すると、その
  38.       Functionオブジェクトを、引数なしで即時に呼び出します。Functionオブジェクト
  39.       以外を渡した場合、例外がスローされます。
  40.  
  41.     logメソッド
  42.         指定した引数をそのまま console.info に渡して呼び出す、新たな Function オ
  43.       ブジェクトを返します。
  44.  
  45.   wtf-objectの仕様
  46.  
  47.     wtf-objectは、上述のwtfの呼び出しの2において、生成されるオブジェクトです。
  48.  
  49.       compute メソッド
  50.           "appearで呼び出される Functionオブジェクト"を追加する、新たなFunction
  51.         オブジェクトを返します。この時、computeの引数として渡した引数のみが追加
  52.         されるFunctionオブジェクトが返されます。Function オブジェクト以外を渡し
  53.         た場合、次回appear呼び出し時に例外がスローされます。
  54.  
  55.       appear メソッド
  56.           第一引数を wtf-objectの内部状態として設定した後、computeメソッドで追加
  57.         されたFunctionオブジェクトを全てをコールする、新たなFunctionオブジェクト
  58.         を返します。内部状態はappearで返されたFunctionオブジェクトが呼び出されな
  59.         い限り、設定されません。
  60.           computeメソッドで追加されたFunction オブジェクトは、appearで指定した引
  61.         数と共に呼び出されます。
  62.  
  63.       内部状態取得メソッド
  64.         内部状態を返します。内部状態は、appear で返されるFunction オブジェクトに
  65.       より設定されます。
  66.         このメソッドの名称は t または、wtfの呼び出し2.に準じます。
  67.  
  68. *******************************************************************************/
  69.  
  70. (function(){
  71.   // from Prototype.js
  72.   Object.prototype.argumentNames(){
  73.     var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
  74.       .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
  75.       .replace(/\s+/g, '').split(',');
  76.     return names.length === 1 && !names[0] ? [] : names;
  77.   }
  78.  
  79.   var key;
  80.   var mysteriousFunction = function(callback){
  81.     return function(){
  82.       key = callback.argumentNames()[0] || 't';
  83.       callback(Date.now);
  84.  
  85.       // only once
  86.       mysteriousFunction = function(){
  87.         throw "ERROR: This code runs in your single universe.";
  88.       };
  89.     };
  90.   };
  91.  
  92.   function generateMysteriousObject(){
  93.     var functors = [];
  94.     var mValue;
  95.  
  96.     var mysteriousObject = {
  97.       compute:function(functor) {
  98.         return [].push.bind(functors,functor);
  99.       },
  100.       appear:function(value) {
  101.         return function()  {
  102.             mValue = value;
  103.             functors.map( function(functor){ functor(value); } );
  104.         };
  105.       }
  106.    };
  107.  
  108.     // keyは、最初にwtfに渡された関数の第一引数の名前です。
  109.     // このプロパティはappearで返される関数により、任意値に設定され、
  110.     // 時間を示す値やDate.nowとは無関係です。
  111.     mysteriousObject[key] = function(){
  112.       return mValue;
  113.     };
  114.  
  115.     return mysteriousObject;
  116.   }
  117.  
  118.   var wtf = function(callback) {
  119.     switch( typeof callback ){
  120.     case "function": return mysteriousFunction(callback);
  121.     default:         return generateMysteriousObject();
  122.     }
  123.   };
  124.  
  125.   Object.defineProperties(wtf, {
  126.     world: {
  127.       set: function(functor) { functor(); }
  128.     }
  129.   });
  130.  
  131.   wtf.log = function()  {
  132.     return console.info.bind(console, arguments);
  133.   };
  134.  
  135.   var root = this;
  136.   if (typeof module !== 'undefined' && module.exports) {
  137.     module.exports = wtf;
  138.   } else {
  139.     root.___ = wtf;
  140.   }
  141.  
  142. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement