     ///   - rhs: The given value.
     /// - Returns: The resulting vector.
     @inlinable
-    public static func / (lhs: CGVector, rhs: CGFloat) -> CGVector {
-        let dx = lhs.dx / rhs
-        let dy = lhs.dy / rhs
-        
-        return CGVector(dx: dx, dy: dy)
-    }
-    
-    /// Adds two vectors and returns the result.
-    ///
-    /// - Parameters:
-    ///   - lhs: A vector.
-    ///   - rhs: Another vector.
-    /// - Returns: The resulting vector.
-    @inlinable
-    public static func + (lhs: CGVector, rhs: CGVector) -> CGVector {
-        let dx = lhs.dx + rhs.dx
-        let dy = lhs.dy + rhs.dy
-        
-        return CGVector(dx: dx, dy: dy)
-    }
-    
-    /// Substracts two vectors and returns the result.
-    ///
-    /// - Parameters:
-    ///   - lhs: A vector.
-    ///   - rhs: Another vector.
-    /// - Returns: The resulting vector.
-    @inlinable
-    public static func - (lhs: CGVector, rhs: CGVector) -> CGVector {
-        return lhs + rhs.reversed()
+    static func / (lhs: CGVector, rhs: CGFloat) -> CGVector {
+        CGVector(dx: lhs.dx / rhs, dy: lhs.dy / rhs)
     }
 }
 
+extension CGVector: AdditiveArithmetic {
+    @inlinable
+    public static func + (lhs: CGVector, rhs: CGVector) -> CGVector {
+        CGVector(dx: lhs.dx + rhs.dx, dy: lhs.dy + rhs.dy)
+    }
+    
+    @inlinable
+    public static func - (lhs: CGVector, rhs: CGVector) -> CGVector {
+        CGVector(dx: lhs.dx - rhs.dx, dy: lhs.dy - rhs.dy)
+    }
+}

    ///   - rhs: The given value.
    /// - Returns: The resulting vector.
    @inlinable
    public static func * (lhs: CGVector, rhs: Double) -> CGVector {
        return lhs * CGFloat(rhs)
    }
    
    /// Multiplies a vector by the given value.

    ///   - rhs: The given value.
    /// - Returns: The resulting vector.
    @inlinable
    static func /<F:BinaryFloatingPoint>(lhs: CGVector, rhs: F) -> CGVector {
        lhs / CGFloat(rhs)
    }
    
    /// Divides a vector by the given value.
