coffeescript fun
I just wrote probably the most ridiculous, and sort of awesome, code of my life to date. 10 points if you can figure out what it does and what the point of it is (and 20 points if you find a bug!)
The code exports two functions, u.bind and u.let (which is syntactic sugar for a special case of u.bind). Here’s an example / test-case of using them:
class Thing constructor: -> @x = 0 setInterval => @x += 1 @get_x_multiplied_by.update_all() , 1000 get_x_multiplied_by: u.bind (y) -> @x * y a = new Thing() u.let -> document.title = a.get_x_multiplied_by 7
And here’s the code that defines u.bind and u.let:
#u = module.exports u = {} #for in-browser testing u.UUID = -> (Date.now()) + 'x' + Math.round(Math.random() *1e18) _running_bound = null magic_number = u.UUID() smish = (thing) -> if thing != null and (typeof thing) == 'object' if not thing[magic_number] thing[magic_number] = u.UUID() return thing[magic_number] else return (typeof thing) + thing smush = (args...) -> return (smish arg for arg in args).join('') run_bound = (bound, fn, args) -> hash_key = smush args..., this if _running_bound if not bound.depends_on_me[hash_key] bound.depends_on_me[hash_key] = [] if _running_bound not in bound.depends_on_me[hash_key] bound.depends_on_me[hash_key].push _running_bound old_running_bound = _running_bound _running_bound = {bound: bound, args: args, old_this: this} if bound.results_cache[hash_key] == undefined bound.results_cache[hash_key] = fn.apply this, args bound.args_cache[hash_key] = {args: args, old_this: this} _running_bound = old_running_bound return bound.results_cache[hash_key] u.bind = (fn) -> bound = (args...) -> val = run_bound.call this, bound, fn, args return val bound.depends_on_me = {} bound.results_cache = {} bound.args_cache = {} bound.update = (args...) -> hash_key = smush args..., this delete bound.results_cache[hash_key] delete bound.args_cache[hash_key] bound.apply this, args depends = bound.depends_on_me[hash_key] ? [] bound.depends_on_me[hash_key] = [] for depend in depends depend.bound.update.apply depend.old_this, depend.args bound.update_all = -> for key, {args, old_this} of bound.args_cache bound.update.apply old_this, args return bound u.let = (fn) -> bound = u.bind fn bound()
If you paste the code followed by the test case in the “try coffeescript” window of coffeescript.org, you can see it in action (watch the webpage title).