diff --git a/src/hyperfiddle/incseq/latest_concat_impl.cljc b/src/hyperfiddle/incseq/latest_concat_impl.cljc index 20fe00edb..e386ee1fc 100644 --- a/src/hyperfiddle/incseq/latest_concat_impl.cljc +++ b/src/hyperfiddle/incseq/latest_concat_impl.cljc @@ -44,7 +44,8 @@ (do (aset state slot-pending true) (unlock state held) (step)) (if (zero? (aget state slot-alive)) - (do (unlock state held) (done)) + (do (aset state slot-pending true) + (unlock state held) (done)) (unlock state held)))))) (defn outer-ready [^objects state] diff --git a/test/hyperfiddle/incseq/latest_concat_impl_test.cljc b/test/hyperfiddle/incseq/latest_concat_impl_test.cljc index d08d1fe1a..4d7649c35 100644 --- a/test/hyperfiddle/incseq/latest_concat_impl_test.cljc +++ b/test/hyperfiddle/incseq/latest_concat_impl_test.cljc @@ -261,4 +261,41 @@ (is (= (q) :cancel0)) (q false) (step0) - (is (q) :done)))) \ No newline at end of file + (is (q) :done)))) + +(deftest cancel-after-termination + (let [q (queue) + ps ((flow (fn [step done] + (step) + (->Ps #(q :cancel) + (fn [] + (done) + {:grow 1 + :degree 1 + :shrink 0 + :permutation {} + :change {0 (fn [step done] + (step) + (->Ps #(q :cancel0) + (fn [] + (done) + {:grow 1 + :degree 1 + :shrink 0 + :permutation {} + :change {0 :foo} + :freeze #{0}})))} + :freeze #{0}})))) + #(q :step) #(q :done))] + (is (= (q) :step)) + (is (= @ps {:grow 1 + :degree 1 + :shrink 0 + :permutation {} + :change {0 :foo} + :freeze #{0}})) + (is (= (q) :done)) + (ps) + (is (= :cancel (q))) + (is (= :cancel0 (q))) + (is (= (doto :over q) (q))))) \ No newline at end of file