# HG changeset patch # User Steve Losh # Date 1604973092 14400 # Node ID 38a1fbc6688ee543249731ed30268685efe834a2 # Parent 1d3928ec556d234be5170bf6073e1b1f3923056f Enhance `prefix-sums` diff -r 1d3928ec556d -r 38a1fbc6688e src/sequences.lisp --- a/src/sequences.lisp Sat Oct 24 15:55:36 2020 -0400 +++ b/src/sequences.lisp Mon Nov 09 21:51:32 2020 -0400 @@ -9,19 +9,24 @@ `(integer 0 (,length))) -(defun prefix-sums (sequence) - "Return a list of the prefix sums of the numbers in `sequence`. +(defun prefix-sums (sequence &key key (result-type 'list)) + "Return the prefix sums of the elements of `sequence`. + + If `key` is given, it will be called on the elements before summing. + `result-type` must be a type suitable for passing to `map`. Example: (prefix-sums '(10 10 10 0 1)) - => (10 20 30 30 31) + ; => (10 20 30 30 31) + + (prefix-sums \"ABCD\" :key #'char-code :result-type '(vector fixnum)) + ; => #(65 131 198 266) " - (iterate - (for i :in-whatever sequence) - (sum i :into s) - (collect s))) + (let ((sum 0)) + (map result-type (lambda (x) (incf sum (if key (funcall key x) x))) + sequence))) (defun frequencies (sequence &key (test #'eql) key) "Return a hash table containing the frequencies of the elements of `sequence`.