   [vertex]
   (let [id   (:id vertex)
         outs @(:outs vertex)]
-    (loop [outs outs]
+    (loop [active (transient []), outs outs]
       (let [[v [f opts]] (first outs)]
-        (when v
+        (if v
           (let [signal (f vertex opts)]
             (if-not (nil? signal)
-              (receive-signal v id signal)
-              (debug "signal fn for" (:id v) "returned nil, skipping...")))
-          (recur (next outs)))))))
+              (do (receive-signal v id signal)
+                  (recur (conj! active v) (next outs)))
+              (do (debug "signal fn for" (:id v) "returned nil, skipping...")
+                  (recur active (next outs)))))
+          (persistent! active))))))
 
 (def default-vertex-state
   {::uncollected      []

      (let [v (first verts)]
        (if (should-signal? v thresh)
          (do (debug (:id v) "signaling")
              (signal! v sync-vertex-signal)
              (recur (inc sigs) (next verts)))
          (recur sigs (next verts))))
      sigs)))


(defn- now [] #?(:clj (System/nanoTime) :cljs (.getTime (js/Date.))))

(defn execution-result
  [type sigs colls t0 & [opts]]
  (->> {:collections colls
        :signals     sigs
        :type        type
