]> git.jsancho.org Git - gacela.git/commitdiff
Composed systems return as single systems
authorJavier Sancho <jsf@jsancho.org>
Sun, 29 Dec 2013 06:59:23 +0000 (07:59 +0100)
committerJavier Sancho <jsf@jsancho.org>
Sun, 29 Dec 2013 06:59:23 +0000 (07:59 +0100)
* src/system.scm: systems created by join or threaded must return a
                  procedure for modify entities an components and must
                  be non-destructive, so alist-copy is used when modifications
                  are calculated

src/system.scm

index 2bf05208fefb215eec76c28e3075ce0a3f56e218..9654cffbafdb4a059aedfc3f3ef33fc58a10b1b2 100644 (file)
 
 (define (join-systems . systems)
   (lambda (entities components)
-    (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))))))))))
 
 (define (threaded-systems . systems)
   (lambda (entities components)
-    (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)
        ((= (length systems) 1)
         (car systems))
        (else
-        (join-systems systems))))
+        (apply join-systems systems))))
 
 (export find-entities-by-components
        define-system