Move SSD OCR predicate helpers to typed Kotlin

ober

d19abd852668e33f6399c0219d577b645e737eb2

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 590bd1b..f314428 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -366,7 +366,7 @@
 
     (typed-kotlin-file "com/sfb/ssdreview/OcrStrings.kt"
       (typed-library (com sfb ssdreview)
-        (export normalizeOcr compact)
+        (export normalizeOcr compact bankCompatible suppressedByRace)
         (def (normalizeOcr (value : String)) : String
           (string-replace-regex
             (string-trim
@@ -377,7 +377,24 @@
             "\\s+"
             " "))
         (def (compact (value : String)) : String
-          (string-filter-letter-or-digit (string-lowercase value)))))
+          (string-filter-letter-or-digit (string-lowercase value)))
+        (def (bankCompatible (label : String) (boxTypeId : String)) : Bool
+          (let ((key (compact label)))
+            (or (or (or (equal? boxTypeId "26")
+                        (equal? boxTypeId "52"))
+                    (or (equal? boxTypeId "99")
+                        (string-contains? key "shield")))
+                (or (or (string-contains? key "papanel")
+                        (string-contains? key "powerabsorber"))
+                    (string-contains? key "padegradation")))))
+        (def (suppressedByRace (race : String) (label : String)) : Bool
+          (let ((key (compact label)))
+            (if (and (equal? race "andromedan") (string-contains? key "shield"))
+              #t
+              (and (not (equal? race "andromedan"))
+                   (or (or (string-contains? key "papanel")
+                           (string-contains? key "powerabsorber"))
+                       (string-contains? key "displacementdevice"))))))))
 
     (kotlin-file-lines "com/sfb/ssdreview/BoxTypes.kt"
       (
@@ -3202,24 +3219,6 @@
        "    private fun protectedBankLabel(group: SsdGroup): Boolean ="
        "        bankCompatible(group.label, group.boxTypeId)"
        ""
-       "    private fun bankCompatible(label: String, boxTypeId: String): Boolean {"
-       "        val key = compact(label)"
-       "        return boxTypeId == \"26\" ||"
-       "            boxTypeId == \"52\" ||"
-       "            boxTypeId == \"99\" ||"
-       "            key.contains(\"shield\") ||"
-       "            key.contains(\"papanel\") ||"
-       "            key.contains(\"powerabsorber\") ||"
-       "            key.contains(\"padegradation\")"
-       "    }"
-       ""
-       "    private fun suppressedByRace(race: String, label: String): Boolean {"
-       "        val key = compact(label)"
-       "        if (race == \"andromedan\" && key.contains(\"shield\")) return true"
-       "        if (race != \"andromedan\" && (key.contains(\"papanel\") || key.contains(\"powerabsorber\") || key.contains(\"displacementdevice\"))) return true"
-       "        return false"
-       "    }"
-       ""
        "}"
        ))
     (kotlin-file-lines "com/sfb/ssdreview/SsdReviewView.kt"