users-gen
1 人以上のユーザーのグループを生成するgenerator があるとします。user-actions-gen
そして、1 人以上のユーザーのシーケンスを取得し、それらのユーザーが実行する一連のアクションを生成する別のパラメーター化されたジェネレーターが呼び出されます。
(def user-gen
;; generates a user
...)
(def users-gen
;; sequences of 1 or more users
(gen/such-that not-empty (gen/vector gen/users))
(defn user-actions-gen [users]
;; a action performed by some user from the `users argument
...)
users-gen によって生成された単一のユーザー シーケンスに対して単一のアクションを生成したい場合は、単純です。users-gen を直接 user-actions-gen に生成/バインドするだけです。
ただし、同じ一連のユーザーから多くのアクションを生成したいと考えています。私がこの問題を抱えているのは、基本的に「これが状態です。任意のランダムなアクションを入力させて、アクションを状態に適用させて、状態がまだ有効であることを確認させてください。これをすべてのアクションに対して実行してください。 " 次のコードがあります。
(defspec check-that-state-is-always-valid
100
(let [state-atm (atom {})]
(prop/for-all
[[actions users]
(gen/bind users-gen
(fn [users]
(gen/tuple
(gen/vector (user-actions-gen users))
(gen/return users))))]
(doseq [action actions
:let [state (swap! state-atm state-atm-transform-fx action)]]
(is (state-still-valid? state))))))
この種の作品。問題は次のとおりです。
- 最初のエラーで停止するのではなく、doseq を完全に評価しているようです。
- ちょっと間違っているように見えます。コードはいたるところにあり、それが何をするのか完全には明らかではありません。
- user-action-gen は、users-gen の実現されたユーザーの値ではなく、users-gen のジェネレーターを使用する必要があるようです。これは構成可能性に役立ちますか? users-gen はおそらく他のジェネレーターに役立つため、それらをまとめたくないことに注意してください。
では、要約します。1 つのジェネレーターから生成された単一の値を取得し、それを引数として複数のジェネレーターに渡しています。より魅力的/エレガントな方法でこれを行うにはどうすればよいですか?