You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							158 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
	
	
							158 lines
						
					
					
						
							3.8 KiB
						
					
					
				// Generated by CoffeeScript 1.6.3 | 
						|
var object, _common, | 
						|
  __hasProp = {}.hasOwnProperty; | 
						|
 | 
						|
_common = require('./_common'); | 
						|
 | 
						|
module.exports = object = { | 
						|
  isBareObject: _common.isBareObject.bind(_common), | 
						|
  /* | 
						|
  	if object is an instance of a class | 
						|
  */ | 
						|
 | 
						|
  isInstance: function(what) { | 
						|
    return !this.isBareObject(what); | 
						|
  }, | 
						|
  /* | 
						|
  	Alias to _common.typeOf | 
						|
  */ | 
						|
 | 
						|
  typeOf: _common.typeOf.bind(_common), | 
						|
  /* | 
						|
  	Alias to _common.clone | 
						|
  */ | 
						|
 | 
						|
  clone: _common.clone.bind(_common), | 
						|
  /* | 
						|
  	Empties an object of its properties. | 
						|
  */ | 
						|
 | 
						|
  empty: function(o) { | 
						|
    var prop; | 
						|
    for (prop in o) { | 
						|
      if (o.hasOwnProperty(prop)) { | 
						|
        delete o[prop]; | 
						|
      } | 
						|
    } | 
						|
    return o; | 
						|
  }, | 
						|
  /* | 
						|
  	Empties an object. Doesn't check for hasOwnProperty, so it's a tiny | 
						|
  	bit faster. Use it for plain objects. | 
						|
  */ | 
						|
 | 
						|
  fastEmpty: function(o) { | 
						|
    var property; | 
						|
    for (property in o) { | 
						|
      delete o[property]; | 
						|
    } | 
						|
    return o; | 
						|
  }, | 
						|
  /* | 
						|
  	Overrides values fomr `newValues` on `base`, as long as they | 
						|
  	already exist in base. | 
						|
  */ | 
						|
 | 
						|
  overrideOnto: function(base, newValues) { | 
						|
    var key, newVal, oldVal; | 
						|
    if (!this.isBareObject(newValues) || !this.isBareObject(base)) { | 
						|
      return base; | 
						|
    } | 
						|
    for (key in base) { | 
						|
      oldVal = base[key]; | 
						|
      newVal = newValues[key]; | 
						|
      if (newVal === void 0) { | 
						|
        continue; | 
						|
      } | 
						|
      if (typeof newVal !== 'object' || this.isInstance(newVal)) { | 
						|
        base[key] = this.clone(newVal); | 
						|
      } else { | 
						|
        if (typeof oldVal !== 'object' || this.isInstance(oldVal)) { | 
						|
          base[key] = this.clone(newVal); | 
						|
        } else { | 
						|
          this.overrideOnto(oldVal, newVal); | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
    return base; | 
						|
  }, | 
						|
  /* | 
						|
  	Takes a clone of 'base' and runs #overrideOnto on it | 
						|
  */ | 
						|
 | 
						|
  override: function(base, newValues) { | 
						|
    return this.overrideOnto(this.clone(base), newValues); | 
						|
  }, | 
						|
  append: function(base, toAppend) { | 
						|
    return this.appendOnto(this.clone(base), toAppend); | 
						|
  }, | 
						|
  appendOnto: function(base, toAppend) { | 
						|
    var key, newVal, oldVal; | 
						|
    if (!this.isBareObject(toAppend) || !this.isBareObject(base)) { | 
						|
      return base; | 
						|
    } | 
						|
    for (key in toAppend) { | 
						|
      if (!__hasProp.call(toAppend, key)) continue; | 
						|
      newVal = toAppend[key]; | 
						|
      if (newVal === void 0) { | 
						|
        continue; | 
						|
      } | 
						|
      if (typeof newVal !== 'object' || this.isInstance(newVal)) { | 
						|
        base[key] = newVal; | 
						|
      } else { | 
						|
        oldVal = base[key]; | 
						|
        if (typeof oldVal !== 'object' || this.isInstance(oldVal)) { | 
						|
          base[key] = this.clone(newVal); | 
						|
        } else { | 
						|
          this.appendOnto(oldVal, newVal); | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
    return base; | 
						|
  }, | 
						|
  groupProps: function(obj, groups) { | 
						|
    var def, defs, grouped, key, name, shouldAdd, val, _i, _len; | 
						|
    grouped = {}; | 
						|
    for (name in groups) { | 
						|
      defs = groups[name]; | 
						|
      grouped[name] = {}; | 
						|
    } | 
						|
    grouped['rest'] = {}; | 
						|
    top: //; | 
						|
    for (key in obj) { | 
						|
      val = obj[key]; | 
						|
      shouldAdd = false; | 
						|
      for (name in groups) { | 
						|
        defs = groups[name]; | 
						|
        if (!Array.isArray(defs)) { | 
						|
          defs = [defs]; | 
						|
        } | 
						|
        for (_i = 0, _len = defs.length; _i < _len; _i++) { | 
						|
          def = defs[_i]; | 
						|
          if (typeof def === 'string') { | 
						|
            if (key === def) { | 
						|
              shouldAdd = true; | 
						|
            } | 
						|
          } else if (def instanceof RegExp) { | 
						|
            if (def.test(key)) { | 
						|
              shouldAdd = true; | 
						|
            } | 
						|
          } else if (def instanceof Function) { | 
						|
            if (def(key)) { | 
						|
              shouldAdd = true; | 
						|
            } | 
						|
          } else { | 
						|
            throw Error('Group definitions must either\ | 
						|
						be strings, regexes, or functions.'); | 
						|
          } | 
						|
          if (shouldAdd) { | 
						|
            grouped[name][key] = val; | 
						|
            continue top; | 
						|
          } | 
						|
        } | 
						|
      } | 
						|
      grouped['rest'][key] = val; | 
						|
    } | 
						|
    return grouped; | 
						|
  } | 
						|
};
 | 
						|
 |