- (let run-wait ((thd
- (map
- (lambda (s)
- (call-with-new-thread
- (lambda () (s entities components))))
- systems))
- (e entities) (c components))
- (cond ((null? thd)
- (values e c))
- (else
- (receive (e2 c2) ((join-thread (car thd)) e c)
- (run-wait (cdr thd) e2 c2)))))))
+ (let ((changes
+ (let run-wait ((thd
+ (map (lambda (s)
+ (call-with-new-thread
+ (lambda () (s entities components))))
+ systems))
+ (res '()))
+ (cond ((null? thd)
+ res)
+ (else
+ (run-wait (cdr thd) (cons (join-thread (car thd)) res)))))))
+ (lambda* (#:optional (entities2 #f) (components2 #f))
+ (let modify ((e (if (and entities2 components2) entities2 entities))
+ (c (if (and entities2 components2) components2 components))
+ (ch changes))
+ (cond ((null? ch)
+ (values e c))
+ (else
+ (receive (e2 c2) ((car ch) e c)
+ (modify e2 c2 (cdr ch))))))))))
+
+(define (group-systems . systems)
+ (cond ((null? systems)
+ (make-system ()))
+ ((= (length systems) 1)
+ (car systems))
+ (else
+ (apply join-systems systems))))