1var Symbol = require('./_Symbol'),
2    copyArray = require('./_copyArray'),
3    getTag = require('./_getTag'),
4    isArrayLike = require('./isArrayLike'),
5    isString = require('./isString'),
6    iteratorToArray = require('./_iteratorToArray'),
7    mapToArray = require('./_mapToArray'),
8    setToArray = require('./_setToArray'),
9    stringToArray = require('./_stringToArray'),
10    values = require('./values');
11
12/** `Object#toString` result references. */
13var mapTag = '[object Map]',
14    setTag = '[object Set]';
15
16/** Built-in value references. */
17var symIterator = Symbol ? Symbol.iterator : undefined;
18
19/**
20 * Converts `value` to an array.
21 *
22 * @static
23 * @since 0.1.0
24 * @memberOf _
25 * @category Lang
26 * @param {*} value The value to convert.
27 * @returns {Array} Returns the converted array.
28 * @example
29 *
30 * _.toArray({ 'a': 1, 'b': 2 });
31 * // => [1, 2]
32 *
33 * _.toArray('abc');
34 * // => ['a', 'b', 'c']
35 *
36 * _.toArray(1);
37 * // => []
38 *
39 * _.toArray(null);
40 * // => []
41 */
42function toArray(value) {
43  if (!value) {
44    return [];
45  }
46  if (isArrayLike(value)) {
47    return isString(value) ? stringToArray(value) : copyArray(value);
48  }
49  if (symIterator && value[symIterator]) {
50    return iteratorToArray(value[symIterator]());
51  }
52  var tag = getTag(value),
53      func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
54
55  return func(value);
56}
57
58module.exports = toArray;
59