Improve the chunking procedures

Remove the empty chunk and use = for numeric equality.
This commit is contained in:
Christopher Baines 2025-03-10 14:09:23 +00:00
parent bf3fdfd8d3
commit 8c79536fa4

View file

@ -76,24 +76,30 @@
(set! var var)) (set! var var))
(define (chunk lst max-length) (define (chunk lst max-length)
(if (> (length lst) (let ((len (length lst)))
max-length) (cond
((= 0 len) '())
((> (length lst) max-length)
(call-with-values (lambda () (call-with-values (lambda ()
(split-at lst max-length)) (split-at lst max-length))
(lambda (first-lst rest) (lambda (first-lst rest)
(cons first-lst (cons first-lst
(chunk rest max-length)))) (chunk rest max-length)))))
(list lst))) (else
(list lst)))))
(define (chunk! lst max-length) (define (chunk! lst max-length)
(if (> (length lst) (let ((len (length lst)))
max-length) (cond
((= 0 len) '())
((> (length lst) max-length)
(call-with-values (lambda () (call-with-values (lambda ()
(split-at! lst max-length)) (split-at! lst max-length))
(lambda (first-lst rest) (lambda (first-lst rest)
(cons first-lst (cons first-lst
(chunk! rest max-length)))) (chunk! rest max-length)))))
(list lst))) (else
(list lst)))))
(define* (chunk-for-each! proc chunk-size #:rest lsts) (define* (chunk-for-each! proc chunk-size #:rest lsts)
(define (do-one-iteration lsts) (define (do-one-iteration lsts)
@ -114,10 +120,10 @@
(apply proc lsts))) (apply proc lsts)))
(let ((list-lengths (map length lsts))) (let ((list-lengths (map length lsts)))
(unless (eq? 1 (length (delete-duplicates list-lengths))) (unless (= 1 (length (delete-duplicates list-lengths)))
(error "lists not equal length")) (error "lists not equal length"))
(unless (eq? 0 (first list-lengths)) (unless (= 0 (first list-lengths))
(do-one-iteration lsts))) (do-one-iteration lsts)))
#t) #t)