      (make-interval mid true       right right-open)]))
 
 
+;;; Generic stuff
+
+(defmethod ga/+ [::interval ::interval] [x y]
+  (add-intervals x y))
+
+(defmethod ga/+ [::interval root-type] [x y]
+  (add-intervals x (make-point-interval y)))
+
+(defmethod ga/+ [root-type ::interval] [x y]
+  (add-intervals y (make-point-interval x)))
 
 
+(defmethod ga/- ::interval [x]
+  (negate-interval x))
+
+
+(defmethod ga/* [::interval ::interval] [x y]
+  (multiply-intervals x y))
+
+(defmethod ga/* [::interval root-type] [x y]
+  (scale-interval x y))
+
+(defmethod ga/* [root-type ::interval] [x y]
+  (scale-interval y x))
+
+
+(defmethod gm/abs ::interval [i]
+  (abs-interval i))
 
 
 

	   (next vs)))
      (make-interval l lo r ro))))

(defn bisect-interval [i]
  (assert-is (not (interval-point interval)))
  (let [{:keys [left right left-open right-open]} i

		 (- (:right i1) (:left i2))
		 (or (:right-open i1) (:left-open i2))))

(defn negate-interval [i]
  (make-interval (- (:right i)) (:right-open i) (- (:left i)) (:left-open i)))

(defn multiply-intervals [i1 i2]
  (loop [l (+ 0 Double/POSITIVE_INFINITY) lo false r (+ 0 Double/NEGATIVE_INFINITY) ro false 
	 vs     (seq (for [[e1 o1] [[(:left i1) (:left-open i1)] [(:right i1) (:right-open i1)]]
