var DataView = require('./_DataView'),

Map = require('./_Map'),
Promise = require('./_Promise'),
Set = require('./_Set'),
WeakMap = require('./_WeakMap'),
baseGetTag = require('./_baseGetTag'),
toSource = require('./_toSource');

/** `Object#toString` result references. */ var mapTag = '[object Map]',

objectTag = '[object Object]',
promiseTag = '[object Promise]',
setTag = '[object Set]',
weakMapTag = '[object WeakMap]';

var dataViewTag = '[object DataView]';

/** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView),

mapCtorString = toSource(Map),
promiseCtorString = toSource(Promise),
setCtorString = toSource(Set),
weakMapCtorString = toSource(WeakMap);

/**

* Gets the `toStringTag` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/

var getTag = baseGetTag;

// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||

  (Map && getTag(new Map) != mapTag) ||
  (Promise && getTag(Promise.resolve()) != promiseTag) ||
  (Set && getTag(new Set) != setTag) ||
  (WeakMap && getTag(new WeakMap) != weakMapTag)) {
getTag = function(value) {
  var result = baseGetTag(value),
      Ctor = result == objectTag ? value.constructor : undefined,
      ctorString = Ctor ? toSource(Ctor) : '';

  if (ctorString) {
    switch (ctorString) {
      case dataViewCtorString: return dataViewTag;
      case mapCtorString: return mapTag;
      case promiseCtorString: return promiseTag;
      case setCtorString: return setTag;
      case weakMapCtorString: return weakMapTag;
    }
  }
  return result;
};

}

module.exports = getTag;