diff options
Diffstat (limited to 'module/srfi/srfi-1.scm')
-rw-r--r-- | module/srfi/srfi-1.scm | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm index 54008146e..852729346 100644 --- a/module/srfi/srfi-1.scm +++ b/module/srfi/srfi-1.scm @@ -472,6 +472,30 @@ that result. See the manual for details." ;;; Searching +(define (break pred clist) + "Return two values, the longest initial prefix of LST whose elements +all fail the predicate PRED, and the remainder of LST." + (let lp ((clist clist) (rl '())) + (if (or (null? clist) + (pred (car clist))) + (values (reverse! rl) clist) + (lp (cdr clist) (cons (car clist) rl))))) + +(define (break! pred list) + "Linear-update variant of `break'." + (let loop ((l list) + (prev #f)) + (cond ((null? l) + (values list '())) + ((pred (car l)) + (if (pair? prev) + (begin + (set-cdr! prev '()) + (values list l)) + (values '() list))) + (else + (loop (cdr l) l))))) + (define (any pred ls . lists) (if (null? lists) (any1 pred ls) |