Add typed Kotlin string predicate helpers

ober

8894a3361f51943de58add4267dab3e54286b4fc

diff --git a/lib/jerboa/typed/checker.ss b/lib/jerboa/typed/checker.ss
index 5250232..f56daa7 100644
--- a/lib/jerboa/typed/checker.ss
+++ b/lib/jerboa/typed/checker.ss
@@ -418,12 +418,21 @@
       (cons 'string-replace-regex
             (make-typed-call-sig (list 'String 'String 'String) 'String '()
               'jvm-string-replace-regex '()))
+      (cons 'string-matches-regex?
+            (make-typed-call-sig (list 'String 'String) 'Bool '()
+              'jvm-string-matches-regex '()))
       (cons 'string-filter-letter-or-digit
             (make-typed-call-sig (list 'String) 'String '()
               'jvm-string-filter-letter-or-digit '()))
       (cons 'string-contains?
             (make-typed-call-sig (list 'String 'String) 'Bool '()
               'jvm-string-contains '()))
+      (cons 'string-starts-with?
+            (make-typed-call-sig (list 'String 'String) 'Bool '()
+              'jvm-string-starts-with '()))
+      (cons 'string-ends-with?
+            (make-typed-call-sig (list 'String 'String) 'Bool '()
+              'jvm-string-ends-with '()))
       (cons 'string-blank?
             (make-typed-call-sig (list 'String) 'Bool '()
               'jvm-string-blank '()))
diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index d10a00f..55c0144 100644
--- a/lib/jerboa/typed/kotlin/lower.ss
+++ b/lib/jerboa/typed/kotlin/lower.ss
@@ -239,6 +239,11 @@
            (list
              (make-kt-new (make-kt-type 'Regex #f '()) (list (cadr args)))
              (caddr args)))]
+        [(jvm-string-matches-regex)
+         (make-kt-member-call
+           (make-kt-new (make-kt-type 'Regex #f '()) (list (cadr args)))
+           'matches
+           (list (car args)))]
         [(jvm-string-filter-letter-or-digit)
          (make-kt-member-call
            (car args)
@@ -249,6 +254,10 @@
                (make-kt-member-call (kt-name1 'ch) 'isLetterOrDigit '()))))]
         [(jvm-string-contains)
          (make-kt-member-call (car args) 'contains (cdr args))]
+        [(jvm-string-starts-with)
+         (make-kt-member-call (car args) 'startsWith (cdr args))]
+        [(jvm-string-ends-with)
+         (make-kt-member-call (car args) 'endsWith (cdr args))]
         [(jvm-string-blank)
          (make-kt-member-call (car args) 'isBlank '())]
         [(jvm-float-array)
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index 57cbc72..8d95877 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -278,7 +278,7 @@
 
 (define ocr-string-form
   '(typed-library (sample typed ocrstrings)
-     (export normalizeOcr compact)
+     (export normalizeOcr compact shouldReplaceOcrLabel)
      (def (normalizeOcr (value : String)) : String
        (string-replace-regex
          (string-trim
@@ -289,7 +289,17 @@
          "\\s+"
          " "))
      (def (compact (value : String)) : String
-       (string-filter-letter-or-digit (string-lowercase value)))))
+       (string-filter-letter-or-digit (string-lowercase value)))
+     (def (shouldReplaceOcrLabel (label : String) (status : String) (notes : String)) : Bool
+       (let ((text (string-trim label)))
+         (if (string-blank? text)
+           #t
+           (if (string-ends-with? text "?")
+             #t
+             (if (string-matches-regex? text "^\\d+\\s+boxes$")
+               #t
+               (and (equal? status "candidate")
+                    (string-starts-with? notes "Guess:")))))))))
 
 (define ocr-string-kotlin (typed-library-form->kotlin-string ocr-string-form))
 
@@ -301,6 +311,12 @@
   ".trim()")
 (test-contains "String filter letter-or-digit lowers to Kotlin filter lambda" ocr-string-kotlin
   "value.lowercase().filter({ ch -> ch.isLetterOrDigit() })")
+(test-contains "String endsWith lowers to Kotlin endsWith" ocr-string-kotlin
+  "text.endsWith(\"?\")")
+(test-contains "String regex matches lowers to Kotlin Regex matches" ocr-string-kotlin
+  "Regex(\"^\\\\d+\\\\s+boxes$\").matches(text)")
+(test-contains "String startsWith lowers to Kotlin startsWith" ocr-string-kotlin
+  "notes.startsWith(\"Guess:\")")
 
 (printf "typed-kotlin tests: ~a passed, ~a failed~%" pass fail)
 (when (> fail 0) (exit 1))