- (let run ((s systems) (e entities) (c components))
- (cond ((null? s)
- (values e c))
- (else
- (receive (e2 c2) (((car s) e c))
- (run (cdr s) e2 c2)))))))
+ (let ((changes
+ (let run ((s systems) (e (alist-copy entities)) (c (alist-copy components)) (res '()))
+ (cond ((null? s)
+ res)
+ (else
+ (let ((r ((car s) e c)))
+ (receive (e2 c2) (r)
+ (run (cdr s) e2 c2 (cons r res)))))))))
+ (lambda* (#:optional (entities2 #f) (components2 #f))
+ (let modify ((e (if (and entities2 components2) entities2 entities))
+ (c (if (and entities2 components2) components2 components))
+ (ch (reverse changes)))
+ (cond ((null? ch)
+ (values e c))
+ (else
+ (receive (e2 c2) ((car ch) e c)
+ (modify e2 c2 (cdr ch))))))))))