 <p>Well, <code>filter-into-logical-order</code> could arguably be cleaner with a switch to <code>reduce</code></p> <pre><code>(defn filter-into-logical-order [as] (last (reduce (fn [[seen accepted-as] action] (let[needed (get ACTIONS action)] (if (or (empty? needed) (some seen needed)) [(conj seen action) (conj accepted-as action)] [seen accepted-as])) ) [#{} []] as))) </code></pre> <p>but that still puts out about 30% empty vectors for me and it's not a generator. I'm not sure the documented combinators actually support what you want, though. <code>gen/vector</code> does not appear to support handing a vector-in-construction to its inner generator so it can know what values are allowed, which is kinda the structure your requirements need.</p>