mes: Add string-fold, string-fold-right.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 7 Apr 2018 11:37:07 +0000 (13:37 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 7 Apr 2018 11:37:07 +0000 (13:37 +0200)
* module/srfi/srfi-13.mes (string-fold, string-fold-right): New
  function.
* tests/srfi-13.test ("string-fold"): Test it.
  ("string-fold-right"): Test it.

module/srfi/srfi-13.mes
tests/srfi-13.test

index 6621b54c59735f2f18374e2e8ede32ae96c135c0..4e77bd0ef61a5c940b06a1be0994bce2bad7538f 100644 (file)
 (define substring/shared substring)
 
 (define string-null? (compose null? string->list))
+
+(define (string-fold cons' nil' s . rest)
+  (let* ((start (and (pair? rest) (car rest)))
+         (end (and start (pair? (cdr rest)) (cadr rest))))
+    (if start (error "string-fold: not supported: start=" start))
+    (if end (error "string-fold: not supported: end=" end))
+    (let loop ((lst (string->list s)) (prev nil'))
+      (if (null? lst) prev
+          (loop (cdr lst) (cons' (car lst) prev))))))
+
+(define (string-fold-right cons' nil' s . rest)
+  (let* ((start (and (pair? rest) (car rest)))
+         (end (and start (pair? (cdr rest)) (cadr rest))))
+    (if start (error "string-fold-right: not supported: start=" start))
+    (if end (error "string-fold-right: not supported: end=" end))
+    (let loop ((lst (reverse (string->list s))) (prev nil'))
+      (if (null? lst) prev
+          (loop (cdr lst) (cons' (car lst) prev))))))
index 14972d7a26b38fec6d3c6cb09294866b90accbb0..486840330be174b4262acdac4369d727b4484f43 100755 (executable)
@@ -9,7 +9,7 @@ exit $?
 ;;; -*-scheme-*-
 
 ;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017,2018 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of Mes.
 ;;;
@@ -48,4 +48,12 @@ exit $?
                3
                (string-index "foo:bar" #\:))
 
+(pass-if-equal "string-fold"
+    "oof"
+  (list->string (string-fold cons '() "foo")))
+
+(pass-if-equal "string-fold-right"
+    "f-o-o-:"
+  (list->string (string-fold-right (lambda (e p) (cons e (cons #\- p))) '(#\:) "foo")))
+
 (result 'report)