
(defmulti vector
 "`vector` creates a `Vector` from a seq."
 (fn [v & args] (class v)))

(defmethod vector ::vector
 ([^Vector v & _]
    (Vector. (.dup ^DoubleMatrix (.me v)) (.meta v))))

(defmethod vector ::double-matrix
  ([^DoubleMatrix x]
   (vector x nil))
  ([^DoubleMatrix x meta]
   (Vector. x meta)))

(defmethod vector ::double-array
  ([doubles] (vector doubles nil))
  ([^doubles doubles meta]
     (vector (DoubleMatrix. doubles) meta)))

(defmethod vector ::double-array-2D
  ([doubles] (vector doubles nil))
  ([^"[[D" doubles meta]
     (vector (DoubleMatrix. doubles) meta)))

(defmethod vector ::collection
  ([c]
     (vector s nil))
  ([coll meta-args]
     (if (empty? coll)
       (Vector. DoubleMatrix/EMPTY meta-args)
       (Vector. (me (matrix m)) meta-map))))

(defmethod vector java.lang.Double
  [x]
  (vector [x]))

(defmethod vector java.lang.Long
  [x]
  (vector [x]))

(defmethod vector :default
  [m & _]
  (if (m/zero-dimensional? m)
    (vector (double (mp/get-0d m)))
    (vector (mp/convert-to-nested-vectors m))))



;; Constructor for vector type.
(defn vector
  ([m]
    (vector m nil))
  ([m meta-map]
    (Vector. (me (matrix m)) meta-map)))
