Move SSD area membership helpers to typed Kotlin

ober

422e5fac68faf40b6a796c82302b48359797e801

diff --git a/.build.yml b/.build.yml
index 6d4eb81..7deaf2d 100644
--- a/.build.yml
+++ b/.build.yml
@@ -5,7 +5,7 @@ packages:
   - make=4.4.1-r4
 sources:
   # Build dependency: full immutable commit, mirrored in dependencies.lock.json.
-  - "https://git.sr.ht/~lisp/jerboa#beef0c004ba40d64aa2a00afb510e31cdfdda9e7"
+  - "https://git.sr.ht/~lisp/jerboa#ef86e0761a15de93a61c67d177b4cadaf882d529"
   # The second source is the build subject selected by the SourceHut submitter.
   - https://git.sr.ht/~lisp/jerboa-android
 tasks:
@@ -14,6 +14,6 @@ tasks:
       test "$(apk info -v chez-scheme)" = chez-scheme-10.3.0-r2
       test "$(apk info -v git)" = git-2.54.0-r0
       test "$(apk info -v make)" = make-4.4.1-r4
-      test "$(git -C ../jerboa rev-parse HEAD)" = beef0c004ba40d64aa2a00afb510e31cdfdda9e7
-      test "$(git -C ../jerboa rev-parse 'HEAD^{tree}')" = a215813fdd7e2648ebf385ca0af397af73b73b3e
+      test "$(git -C ../jerboa rev-parse HEAD)" = ef86e0761a15de93a61c67d177b4cadaf882d529
+      test "$(git -C ../jerboa rev-parse 'HEAD^{tree}')" = ca975cbb04f1ca057e3f9cb1404795622a79d6c4
       JERBOA="chez --libdirs .:../jerboa/lib --script" make test
diff --git a/dependencies.lock.json b/dependencies.lock.json
index 75ac3c6..dc4ff29 100644
--- a/dependencies.lock.json
+++ b/dependencies.lock.json
@@ -11,8 +11,8 @@
   "generator_runtime": {
     "name": "jerboa",
     "repository": "https://git.sr.ht/~lisp/jerboa",
-    "commit": "beef0c004ba40d64aa2a00afb510e31cdfdda9e7",
-    "tree": "a215813fdd7e2648ebf385ca0af397af73b73b3e"
+    "commit": "ef86e0761a15de93a61c67d177b4cadaf882d529",
+    "tree": "ca975cbb04f1ca057e3f9cb1404795622a79d6c4"
   },
   "assurance_tools": {
     "osv_scanner": {
diff --git a/jandroid.ss b/jandroid.ss
index 12abfe0..43031f1 100644
--- a/jandroid.ss
+++ b/jandroid.ss
@@ -843,19 +843,35 @@
                    (kt-file-declarations file))])
     (kotlin-file->string merged)))
 
+(def (merge-kotlin-imports file imports)
+  (make-kt-file
+    (kt-file-package file)
+    imports
+    (kt-file-declarations file)))
+
 (def (write-typed-kotlin-files spec root)
-  (for-each
-    (lambda (file-form)
-      (let-values ([(path imports library-form)
-                    (typed-kotlin-file-parts file-form)])
-        (unless (string=? (path-extension path) ".kt")
-          (error 'typed-kotlin-file "generated Kotlin path must end in .kt"
-                 path))
+  (let* ([entries
+          (map
+            (lambda (file-form)
+              (let-values ([(path imports library-form)
+                            (typed-kotlin-file-parts file-form)])
+                (unless (string=? (path-extension path) ".kt")
+                  (error 'typed-kotlin-file "generated Kotlin path must end in .kt"
+                         path))
+                (list path imports library-form)))
+            (typed-kotlin-files spec))]
+         [kotlin-files
+          (typed-library-forms->kotlin-files
+            (map caddr entries))])
+    (for-each
+      (lambda (entry file)
         (write-generated-file
           root
-          (path-join "app" "src" "main" "java" path)
-          (typed-library-form->kotlin-string/imports library-form imports))))
-    (typed-kotlin-files spec)))
+          (path-join "app" "src" "main" "java" (car entry))
+          (kotlin-file->string
+            (merge-kotlin-imports file (cadr entry)))))
+      entries
+      kotlin-files)))
 
 (def (generated-main-activity? spec relative)
   (let ([wanted (path-join (package-path (app-id spec)) "MainActivity.kt")])
diff --git a/scripts/verify-supply-chain.sh b/scripts/verify-supply-chain.sh
index 9825052..bda6f5e 100755
--- a/scripts/verify-supply-chain.sh
+++ b/scripts/verify-supply-chain.sh
@@ -3,8 +3,8 @@ set -eu
 
 repo=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd -P)
 lock="$repo/dependencies.lock.json"
-jerboa_commit=beef0c004ba40d64aa2a00afb510e31cdfdda9e7 # gitsafe:ignore
-jerboa_tree=a215813fdd7e2648ebf385ca0af397af73b73b3e # gitsafe:ignore
+jerboa_commit=ef86e0761a15de93a61c67d177b4cadaf882d529 # gitsafe:ignore
+jerboa_tree=ca975cbb04f1ca057e3f9cb1404795622a79d6c4 # gitsafe:ignore
 gradle_sha=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
 jdk_macos_sha=8fa1eff40bb637a33613b2ccb8b12c70dc3661cc22cf8e784943715769a05336
 jdk_linux_sha=d8afc263758141a66e0e3aafc321e783f7016696f4eaea067d340a269037d331
diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 86303d5..a0d5515 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -231,7 +231,8 @@
                 SsdSession-imageWidth SsdSession-imageHeight
                 SsdSession-cells SsdSession-groups SsdSession-ocrWords
                 SsdSession-suppressedGroups
-                SsdSession-ssdArea SsdSession-ssdArea-set!)
+                SsdSession-ssdArea SsdSession-ssdArea-set!
+                ssdSessionCellInsideSsdArea ssdSessionGroupInsideSsdArea)
         (type Int32)
         (type FloatArray)
         (type SsdCell)
@@ -251,7 +252,19 @@
            (groups : (MutableList SsdGroup))
            (ocrWords : (MutableList OcrWord))
            (suppressedGroups : (MutableList SsdGroup))
-           (mut ssdArea : (Nullable FloatArray))))))
+           (mut ssdArea : (Nullable FloatArray))))
+        (def (ssdSessionCellInsideSsdArea (session : SsdSession) (cell : SsdCell)) : Bool
+          (if (nullable-null? (SsdSession-ssdArea session))
+            #t
+            (rectCenterInside
+              (ssdCellRect cell)
+              (nullable-get (SsdSession-ssdArea session)))))
+        (def (ssdSessionGroupInsideSsdArea (session : SsdSession) (group : SsdGroup)) : Bool
+          (if (nullable-null? (SsdSession-ssdArea session))
+            #t
+            (rectCenterInside
+              (SsdGroup-bbox group)
+              (nullable-get (SsdSession-ssdArea session)))))))
 
     (typed-kotlin-file "com/sfb/ssdreview/SourceKey.kt"
       (typed-library (com sfb ssdreview)
@@ -2825,12 +2838,6 @@
        "    group.bbox = floatArrayOf(x1, y1, x2, y2)"
        "}"
        ""
-       "fun ssdSessionCellInsideSsdArea(session: SsdSession, cell: SsdCell): Boolean ="
-       "    session.ssdArea?.let { area -> rectCenterInside(ssdCellRect(cell), area) } ?: true"
-       ""
-       "fun ssdSessionGroupInsideSsdArea(session: SsdSession, group: SsdGroup): Boolean ="
-       "    session.ssdArea?.let { area -> rectCenterInside(group.bbox, area) } ?: true"
-       ""
        "fun ssdSessionSetSsdArea(session: SsdSession, area: FloatArray): Int {"
        "    session.ssdArea = floatArrayOf("
        "        min(area[0], area[2]),"