Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*******************************************************************************
- worldtimestreamコンポーネント
- コンポーネントは、worldtimestream Function オブジェクト(以下wtfとします)をエク
- スポートします。CommonJS(module.exports)に未対応の環境で読み込んだ場合、グローバ
- ルなコンテキストのthis.___ にコンポーネントが格納されます。
- var wtf = require('worldtimestream');
- console.log( typeof wtf ); // => "function"
- また、Object.prototypeを拡張し、ObjectにargumentNamesメソッドを追加します。
- wtfの呼び出し
- 1. 引数としてFunctionオブジェクトを渡し、wtf を呼び出した場合、渡された関数オ
- ブジェクトを、Date.nowを第一引数として渡しコールバックします。
- wtf(function(x){
- console.log( x === Date.now ); // => "true"
- });
- この時、wtfは渡されたFunction オブジェクトの第一引数の名前を記憶します。
- 第一引数がない場合、't'を格納します。上記の例では 'x'となります。なお、引数
- の名前切り出しは、Prototype.jsのargumentNamesと同一の仕様です。
- 二回目以降、このFunctionオブジェクトを渡すwtfの呼び出しを実行した場合、例
- 外がスローされます。
- 2. 1以外の場合、wtfはObject オブジェクト (以下wtf-objectとします)を返します。
- この時、wtf-objectには、1.で記憶した第一引数の名前をキーとして、内部状態
- 取得メソッドが追加されます。1を実行する前に2を実行した場合、メソッド名は不
- 定です。
- wtfのプロパティ、メソッド
- worldプロパティ
- 書き込み専用のプロパティです。Functionオブジェクトを代入すると、その
- Functionオブジェクトを、引数なしで即時に呼び出します。Functionオブジェクト
- 以外を渡した場合、例外がスローされます。
- logメソッド
- 指定した引数をそのまま console.info に渡して呼び出す、新たな Function オ
- ブジェクトを返します。
- wtf-objectの仕様
- wtf-objectは、上述のwtfの呼び出しの2において、生成されるオブジェクトです。
- compute メソッド
- "appearで呼び出される Functionオブジェクト"を追加する、新たなFunction
- オブジェクトを返します。この時、computeの引数として渡した引数のみが追加
- されるFunctionオブジェクトが返されます。Function オブジェクト以外を渡し
- た場合、次回appear呼び出し時に例外がスローされます。
- appear メソッド
- 第一引数を wtf-objectの内部状態として設定した後、computeメソッドで追加
- されたFunctionオブジェクトを全てをコールする、新たなFunctionオブジェクト
- を返します。内部状態はappearで返されたFunctionオブジェクトが呼び出されな
- い限り、設定されません。
- computeメソッドで追加されたFunction オブジェクトは、appearで指定した引
- 数と共に呼び出されます。
- 内部状態取得メソッド
- 内部状態を返します。内部状態は、appear で返されるFunction オブジェクトに
- より設定されます。
- このメソッドの名称は t または、wtfの呼び出し2.に準じます。
- *******************************************************************************/
- (function(){
- // from Prototype.js
- Object.prototype.argumentNames(){
- var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
- .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
- .replace(/\s+/g, '').split(',');
- return names.length === 1 && !names[0] ? [] : names;
- }
- var key;
- var mysteriousFunction = function(callback){
- return function(){
- key = callback.argumentNames()[0] || 't';
- callback(Date.now);
- // only once
- mysteriousFunction = function(){
- throw "ERROR: This code runs in your single universe.";
- };
- };
- };
- function generateMysteriousObject(){
- var functors = [];
- var mValue;
- var mysteriousObject = {
- compute:function(functor) {
- return [].push.bind(functors,functor);
- },
- appear:function(value) {
- return function() {
- mValue = value;
- functors.map( function(functor){ functor(value); } );
- };
- }
- };
- // keyは、最初にwtfに渡された関数の第一引数の名前です。
- // このプロパティはappearで返される関数により、任意値に設定され、
- // 時間を示す値やDate.nowとは無関係です。
- mysteriousObject[key] = function(){
- return mValue;
- };
- return mysteriousObject;
- }
- var wtf = function(callback) {
- switch( typeof callback ){
- case "function": return mysteriousFunction(callback);
- default: return generateMysteriousObject();
- }
- };
- Object.defineProperties(wtf, {
- world: {
- set: function(functor) { functor(); }
- }
- });
- wtf.log = function() {
- return console.info.bind(console, arguments);
- };
- var root = this;
- if (typeof module !== 'undefined' && module.exports) {
- module.exports = wtf;
- } else {
- root.___ = wtf;
- }
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement