Skip to content

Instantly share code, notes, and snippets.

@dfkaye
Last active December 30, 2015 07:39
Show Gist options
  • Save dfkaye/7797707 to your computer and use it in GitHub Desktop.
Save dfkaye/7797707 to your computer and use it in GitHub Desktop.
metafunction-notes

take a closure:

var closure = (function() {

  var secret = function (arg) {
    return 'secret says arg is ' + arg
  };
  
  var f = function (arg) {
    return 'f: ' + secret(arg)
  };
  
  return f
}());

inspect it:

var fn = closure.inspect() 

Or var fn = inspect(closure);

fn.arguments []
fn.name str
fn.returns []
fn.source closure.toString()

modify it:

fn.inject('secret', function(arg) { return 'injected secret' });

call it:

var result = fn.invoke(contextData, argument);

// => result === 'f: injected secret'

Now use the insane clj pattern:

(inspect(closure)
  ('alias')
  (function () {
    expect(alias.descriptor.arguments.length).toBe(1)
  }));
  
    
(inspect(closure)
  ('alias')
  ({ 
     secret: function (arg) { 
       return 'injected secret' 
     },
     expect: expect, 
     alias: closure
  })
  (function () {
    expect(alias()).toBe('injected secret')
  }));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment