52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Scheme
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Scheme
		
	
	
	
	
	
(library
 | 
						|
  (list-utils)
 | 
						|
 | 
						|
  (export tails
 | 
						|
          intersperse
 | 
						|
          iterate
 | 
						|
          comparing
 | 
						|
          list-group-by
 | 
						|
          accumulate)
 | 
						|
 | 
						|
  (import (rnrs)
 | 
						|
          (srfi s8 receive))
 | 
						|
 | 
						|
  (define (tails xs)
 | 
						|
    (if (null? xs)
 | 
						|
        '()
 | 
						|
        (cons xs (tails (cdr xs)))))
 | 
						|
 | 
						|
  (define (intersperse sep xs)
 | 
						|
    (cond
 | 
						|
      ((null? xs) '())
 | 
						|
      ((null? (cdr xs)) xs)
 | 
						|
      (else (cons (car xs)
 | 
						|
                  (cons sep
 | 
						|
                        (intersperse sep (cdr xs)))))))
 | 
						|
 | 
						|
  (define (iterate fn count)
 | 
						|
    (let loop ((count count))
 | 
						|
     (if (zero? count)
 | 
						|
        '()
 | 
						|
        (cons (fn) (loop (- count 1))))))
 | 
						|
 | 
						|
  (define (comparing cmp key)
 | 
						|
    (lambda (x y)
 | 
						|
      (cmp (key x) (key y))))
 | 
						|
 | 
						|
  ;; Assumes the list is already sorted
 | 
						|
  (define (list-group-by pred xs)
 | 
						|
    (if (null? xs)
 | 
						|
        '()
 | 
						|
        (let ((fst (car xs)))
 | 
						|
         (receive (g1 gs) (partition (lambda (x) (pred fst x)) (cdr xs))
 | 
						|
                  (cons (cons fst g1)
 | 
						|
                        (list-group-by pred gs))))))
 | 
						|
 | 
						|
  ;; calculates a running total for a list.  Returns a list.
 | 
						|
  (define (accumulate xs)
 | 
						|
    (let loop ((xs xs) (total 0))
 | 
						|
     (if (null? xs)
 | 
						|
         '()
 | 
						|
         (cons total (loop (cdr xs) (+ total (car xs))))))))
 |