Returns the current type of an object

@param {Object} obj - source object
@param {?string=} [opt_use] - cycle type for iteration: for, for in, for of, async for of
@return {?string}
function getType(obj, opt_use) {
	if (!obj) {
		return null;
	}

	switch (opt_use) {
		case 'for':
			return 'array';

		case 'for in':
			return 'object';

		case 'for of':
			return 'iterator';

		case 'async for of':
			return 'asyncIterator';

		default:
			if (obj === Empty) {
				return null;
			}

			if (isMap(obj)) {
				return 'map';
			}

			if (isWeakMap(obj)) {
				return 'weakMap';
			}

			if (isSet(obj)) {
				return 'set';
			}

			if (isWeakSet(obj)) {
				return 'weakSet';
			}

			if (isGenerator(obj)) {
				return 'generator';
			}

			if (isLikeArray(obj)) {
				return 'array';
			}

			if (isIterator(obj)) {
				return 'iterator';
			}

			if (isIDBRequest(obj)) {
				return 'idbRequest';
			}

			if (isStream(obj)) {
				return 'stream';
			}
	}

	return 'object';
}