(defun each (sequence function &key lifetime) (etypecase sequence (null (pend :success NIL)) (cons (labels ((next (sequence) (when sequence (let ((result (funcall function (pop sequence)))) (if (typep result 'promise) (then result (lambda (v) (declare (ignore v)) (funcall #'next sequence))) (then (pend :success sequence) #'next)))))) (then (pend :success sequence) #'next))) (vector (let ((length (length sequence))) (labels ((next (i) (when (< i length) (let ((result (funcall function (aref sequence i)))) (if (typep result 'promise) (then result (lambda (v) (declare (ignore v)) (funcall #'next (1+ i)))) (then (pend :success (1+ i)) #'next)))))) (then (pend :success 0) #'next))))))