code: function(func) {
        return (function(p) {
          return function() {
            return func(p(p)).apply(this, arguments);
          };
        })(function(p) {
          return function() {
            return func(p(p)).apply(this, arguments);
          };
        });
      }
docs: /*
  y combinator