public static function merge($collection1, $collection2)
    {
        return __::reduceRight(func_get_args(), function ($source, $result) {
            __::doForEach($source, function ($sourceValue, $key) use (&$result) {
                $value = $sourceValue;
                if (__::isCollection($value)) {
                    $value = __::merge(__::get($result, $key), $sourceValue);
                }
                $result = __::set($result, $key, $value);
            });

            return $result;
        }, []);
    }