Add typed SSD OCR geometry helpers

ober

8a5fdd3580ce018bfd074da3f4e969586980b7f7

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index e245d5a..0167b3b 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -501,10 +501,14 @@
 
     (typed-kotlin-file "com/sfb/ssdreview/OcrGeometry.kt"
       (typed-library (com sfb ssdreview)
-        (export centerInside rectArea normalizeRect)
+        (export centerInside rectArea normalizeRect rectsOverlap distanceToRect)
         (type Float32)
         (type FloatArray)
         (type Int32)
+        (def (floatArrayGetOrZero (items : FloatArray) (index : Int32)) : Float32
+          (if (> (float-array-length items) index)
+            (float-array-ref items index)
+            (float32 0.0)))
         (def (centerInside (bbox : FloatArray) (rect : FloatArray)) : Bool
           (if (or (< (float-array-length bbox) (int32 4))
                   (< (float-array-length rect) (int32 4)))
@@ -545,8 +549,32 @@
             (if (> (float-array-ref rect (int32 1))
                    (float-array-ref rect (int32 3)))
               (float-array-ref rect (int32 1))
-              (float-array-ref rect (int32 3)))))))
-
+              (float-array-ref rect (int32 3)))))
+        (def (rectsOverlap (a : FloatArray) (b : FloatArray)) : Bool
+          (and (and (<= (floatArrayGetOrZero a (int32 0))
+                       (floatArrayGetOrZero b (int32 2)))
+                    (>= (floatArrayGetOrZero a (int32 2))
+                       (floatArrayGetOrZero b (int32 0))))
+               (and (<= (floatArrayGetOrZero a (int32 1))
+                       (floatArrayGetOrZero b (int32 3)))
+                    (>= (floatArrayGetOrZero a (int32 3))
+                       (floatArrayGetOrZero b (int32 1))))))
+        (def (distanceToRect (x : Float32) (y : Float32) (rect : FloatArray)) : Float32
+          (let ((left (floatArrayGetOrZero rect (int32 0)))
+                (top (floatArrayGetOrZero rect (int32 1)))
+                (right (floatArrayGetOrZero rect (int32 2)))
+                (bottom (floatArrayGetOrZero rect (int32 3))))
+            (let ((dx (if (< x left)
+                        (- left x)
+                        (if (> x right)
+                          (- x right)
+                          (float32 0.0))))
+                  (dy (if (< y top)
+                        (- top y)
+                        (if (> y bottom)
+                          (- y bottom)
+                          (float32 0.0)))))
+              (+ dx dy))))))
 
     (typed-kotlin-file "com/sfb/ssdreview/VisionPixels.kt"
       (typed-library (com sfb ssdreview)