#?(:clj
(do
(defmethod g/floor [::complex] [^Complex a]
(let [re (g/floor (.getReal a))
im (g/floor (.getImaginary a))]
(if (g/zero? im)
re
(complex re im))))
(defmethod g/ceiling [::complex] [^Complex a]
(let [re (g/ceiling (.getReal a))
im (g/ceiling (.getImaginary a))]
(if (g/zero? im)
re
(complex re im))))
(defmethod g/sub [::complex ::complex] [^Complex a ^Complex b] (.subtract a b))
(defmethod g/sub [::complex ::v/real] [^Complex a n] (.subtract a (double n)))
(defmethod g/sub [::v/real ::complex] [n ^Complex a] (.add (.negate a) (double n)))
(defmethod g/mul [::complex ::complex] [^Complex a ^Complex b] (.multiply a b))
(defmethod g/mul [::complex ::v/real] [^Complex a n] (.multiply a (double n)))
(defmethod g/mul [::v/real ::complex] [n ^Complex a] (.multiply a (double n)))
(defmethod g/div [::complex ::complex] [^Complex a ^Complex b] (.divide a b))
(defmethod g/div [::complex ::v/real] [^Complex a n] (.divide a (double n)))
(defmethod g/div [::v/real ::complex] [n ^Complex a] (.multiply (.reciprocal a) (double n)))
(defmethod g/negate [::complex] [^Complex a] (.negate a))
(defmethod g/invert [::complex] [^Complex a] (.reciprocal a)))
:cljs
(do
(defmethod g/floor [::complex] [a] (.floor ^js a))
(defmethod g/ceiling [::complex] [a] (.ceil ^js a))
(defmethod g/sub [::complex ::complex] [a b] (.sub ^js a b))
(defmethod g/sub [::complex ::v/real] [a n] (.sub ^js a (u/double n)))
(defmethod g/sub [::v/real ::complex] [n a] (.add ^js (.neg ^js a) (u/double n)))
(defmethod g/mul [::complex ::complex] [a b] (.mul ^js a b))
(defmethod g/mul [::complex ::v/real] [a n] (.mul ^js a (u/double n)))
(defmethod g/mul [::v/real ::complex] [n a] (.mul ^js a (u/double n)))
(defmethod g/div [::complex ::complex] [a b] (.div ^js a b))
(defmethod g/div [::complex ::v/real] [a n] (.div ^js a (u/double n)))
(defmethod g/div [::v/real ::complex] [n a]
(.mul ^js (.inverse ^js a) (u/double n)))
(defmethod g/negate [::complex] [a] (.neg ^js a))
(defmethod g/invert [::complex] [a] (.inverse ^js a))))