Advertisement
Guest User

Untitled

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