Delayed Mouse Tracking
JavaScript
// library
var args2array=
new function(){
var slice= [].slice
return function( list ){
return slice.call( list, 0 )
}
}
Function.prototype.bind=
function(){
var func= this
var args= args2array( arguments )
var obj= args.shift()
return function( ){
var res= func.apply
( obj
, args.concat
( args2array( arguments )
)
)
return res
}
}
FAsyncPipe=
function(){
var list= arguments
var len= list.length
var wrapper= function(){}
for( var i= len; --i >= 0; ){
wrapper= list[ i ].bind( wrapper )
}
return wrapper
}
FCollector=
function( map ){
return function( args ){
var state= {}
var counter= 1
var sync= function(){
--counter
if( !counter ) this( state )
}.bind( this )
var thread= function( key ){
return function( arg ){
state[ key ]= arg
sync()
}
}
for( var key in map ){
if( !map.hasOwnProperty( key ) ) continue
++counter
map[ key ].call
( thread( key )
, args[ key ]
)
}
sync()
}
}
// application
var makeAsync=
function( func ){
return function( arg ){
setTimeout
( this.bind
( null
, func( arg )
)
, 0
)
}
}
var square=
FAsyncPipe
( FCollector
( { width: makeAsync( parseInt )
, height: makeAsync( parseInt )
}
)
, makeAsync
( function( arg ){
return arg.width * arg.height
}
)
, function( arg ){
this( arg + 'px^2' )
}
, function( arg ){
alert( arg )
}
)
square(
{ width: '3px'
, height: '5px'
})