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' 
})