code: function isMapLike(obj) {
  	if(isPrimitive(obj)) {
  		return false;
  	}
  	var isMapLike = obj[canSymbol.for("can.isMapLike")];
  	if(typeof isMapLike !== "undefined") {
  		return !!isMapLike;
  	}
  	var value = obj[canSymbol.for("can.getKeyValue")];
  	if(value !== undefined) {
  		return !!value;
  	}
  	// everything else in JS is MapLike
  	return true;
  }
docs: @function can-reflect.isMapLike isMapLike
  @parent can-reflect/type
  
  @description Test if a value represents multiple values.
  
  @signature `isMapLike(obj)`
  
  Return `true` if `obj` is _not_ a primitive, does _not_ have a falsy value for
  [can-symbol/symbols/isMapLike `@@@@can.isMapLike`], or alternately implements
  [can-symbol/symbols/getKeyValue `@@@@can.getKeyValue`]; `false` otherwise.
  
  ```js
  canReflect.isMapLike(null); // -> false
  canReflect.isMapLike(1); // -> false
  canReflect.isMapLike("foo"); // -> false
  canReflect.isMapLike({}); // -> true
  canReflect.isMapLike(function() {}); // -> true
  canReflect.isMapLike([]); // -> false
  canReflect.isMapLike({ [canSymbol.for("can.isMapLike")]: false }); // -> false
  canReflect.isMapLike({ [canSymbol.for("can.getKeyValue")]: null }); // -> false
  canReflect.isMapLike(canCompute()); // -> false
  canReflect.isMapLike(new DefineMap()); // -> true
  
  ```
  
  @param  {*}  obj maybe a Map-like
  @return {Boolean}