     }
     
     @inlinable
-    func _offset2(_ signed: Bool, _ _offset_point: (Double) -> Point?, _ range: ClosedRange<Double>, _ limit: Int, _ calback: (ClosedRange<Double>, CubicBezier<Point>) throws -> Void) rethrows {
+    func _offset2(_ signed: Bool, _ _offset_point: (Double) -> (Point, Point)?, _ range: ClosedRange<Double>, _ limit: Int, _ calback: (ClosedRange<Double>, CubicBezier<Point>) throws -> Void) rethrows {
         
         let s = range.lowerBound
         let t = range.upperBound

            return
        }
        
        guard let q0 = _offset_point(s) else { return }
        guard let q3 = _offset_point(t) else { return }
        
        let d0 = (q0 - self.eval(s)).unit * SDTransform.rotate(signed ? -0.5 * .pi : 0.5 * .pi)
        let d3 = (q3 - self.eval(t)).unit * SDTransform.rotate(signed ? -0.5 * .pi : 0.5 * .pi)
        
        let angle = (d3.phase - d0.phase).remainder(dividingBy: 2 * .pi)
        
        if abs(angle) > 0.25 * .pi {
            
            let center = self.eval(0.5 * (s + t))
            guard var a = _offset_point(0.5 * (s + t))?.distance(to: center) else { return }
            if signed { a = -a }
            
            let arc = BezierArc(angle).map { a * $0 * SDTransform.rotate(d0.phase - 0.5 * .pi) + center }

extension BezierProtocol where Scalar == Double, Element == Point {
    
    @inlinable
    func _offset(_ signed: Bool, _ _offset_point: (Double) -> (Point, Point)?, _ calback: (ClosedRange<Double>, CubicBezier<Point>) throws -> Void) rethrows {
        
        var s = 0.0
        
