Move SSD area application to typed Kotlin

ober

4a1c5990ca568eadf304688ba63923595ebc1149

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 18bf820..318923b 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -6077,8 +6077,10 @@
       (kotlin-imports (org json JSONObject))
       (typed-library (com sfb ssdreview)
         (export groundTruthPathDetails snapshotEventJson sessionEventJson
-                ssdAreaSetDetails)
+                ssdAreaSetDetails ssdSessionApplySsdArea)
+        (type FloatArray)
         (type JSONObject)
+        (type SsdSession)
         (type Int32)
         (type String)
         (def (groundTruthPathDetails (path : String)) : JSONObject
@@ -6123,7 +6125,16 @@
               (json-object-put-int32! out "removed_groups" removedGroups)
               (json-object-put-int32! out "before_groups" beforeGroups)
               (json-object-put-int32! out "outside_groups" outsideGroups)
-              out)))))
+              out)))
+        (def (ssdSessionApplySsdArea
+               (session : SsdSession)
+               (area : FloatArray)) : JSONObject
+          (let ((beforeGroups (list-size (SsdSession-groups session))))
+            (begin
+              (ssdSessionStoreSsdArea session area)
+              (let ((outsideCount (ssdSessionSsdAreaOutsideCount session)))
+                (let ((removed (ssdSessionPruneGroupsOutsideSsdArea session)))
+                  (ssdAreaSetDetails removed beforeGroups outsideCount))))))))
 
     (typed-kotlin-file "com/sfb/ssdreview/TruthStoreJson.kt"
       (kotlin-imports (java io File) (org json JSONArray) (org json JSONObject))
@@ -7429,13 +7440,10 @@
        "            setStatus(\"SSD area ignored: selection was too small\")"
        "            return"
        "        }"
-       "        val beforeGroups = session.groups.size"
-       "        ssdSessionStoreSsdArea(session, area)"
-       "        val outsideCount = ssdSessionSsdAreaOutsideCount(session)"
-       "        val removed = ssdSessionPruneGroupsOutsideSsdArea(session)"
+       "        val details = ssdSessionApplySsdArea(session, area)"
 	       "        mainActivitySelectGroupId(this, reviewView, ssdSessionSelectedGroupId(session, selectedGroupId))"
 	       "        reviewViewSetSsdAreaFromSession(reviewView, session)"
-	       "        truthStore.appendEvent(\"ssd_area_set\", session, ssdAreaSetDetails(removed, beforeGroups, outsideCount))"
+	       "        truthStore.appendEvent(\"ssd_area_set\", session, details)"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
 	       "        reviewView.invalidate()"
 	       "        saveSessionAsync("