diff --git a/module/srfi/srfi-13.mes b/module/srfi/srfi-13.mes index 01765d40..85db85e9 100644 --- a/module/srfi/srfi-13.mes +++ b/module/srfi/srfi-13.mes @@ -25,6 +25,7 @@ ;;; Code: (mes-use-module (srfi srfi-1)) +(mes-use-module (srfi srfi-14)) (define (string-copy s) (list->string (string->list s))) @@ -132,3 +133,24 @@ (or (match (cdr start) (cdr needle) (1+ n)) (loop (cdr string) (1+ i))) (loop (cdr string) (1+ i)))))))))) + +(define (string-trim string . pred) + (list->string + (if (pair? pred) (error "string-trim: not supported: PRED=" pred) + (let loop ((lst (string->list string))) + (if (or (null? lst) + (not (char-whitespace? (car lst)))) lst + (loop (cdr lst))))))) + +(define (string-trim-right string . pred) + (list->string + (reverse! + (if (pair? pred) (error "string-trim-right: not supported: PRED=" pred) + (let loop ((lst (reverse (string->list string)))) + (if (or (null? lst) + (not (char-whitespace? (car lst)))) lst + (loop (cdr lst)))))))) + +(define (string-trim-both string . pred) + ((compose string-trim string-trim-right) string)) + diff --git a/tests/srfi-13.test b/tests/srfi-13.test index d7f5f892..f9394db8 100755 --- a/tests/srfi-13.test +++ b/tests/srfi-13.test @@ -68,4 +68,13 @@ exit $? (pass-if-not "string-contains not" (string-contains "fuba" "bar")) +(pass-if-equal "string-trim" "foo " + (string-trim " foo ")) + +(pass-if-equal "string-trim-right" " foo" + (string-trim-right " foo ")) + +(pass-if-equal "string-trim-both" "foo" + (string-trim-both " foo ")) + (result 'report)