rep(any, num)

昨日のやつを一般化してみた。

function rep(any, num){
  var o = any, n = num | 0, O = {};
  if(n > 1) switch(O.toString.call(o).slice(8, -1)){
    case 'String':
    { var r = '';
      do if(n & 1) r += o; while((n >>= 1) && (o += o));
      return r }
    case 'Array':
    { var r = [], p = r.push;
      do if(n & 1) p.apply(r, o); while((n >>= 1) && (o = o.concat(o)));
      return r }
    case 'Function':
    { var r = function(x){ return x }, f = function(x){ return o(x) };
      do if(n & 1) r = (function(r, f){
        return function(x){ return r(f(x)) }})(r, f);
      while((n >>= 1) && (f = (function(f){
        return function(x){ return f(f(x)) }})(f)));
      return r }
    case 'RegExp':
    { var f = '', p = {global:'g',ignoreCase:'i',multiline:'m',sticky:'y'};
      for(var k in p) if(!O[k] && o[k]) f += p[k];
      return RegExp(rep(o.source, n), f) }
    case 'Number': return o * n;
  }
  return any;
}

繰り返せそうに無いものはそのまま。Function のとこがカオス。