ゲームエンジンを実装しています。現在、私のコードのほとんどはStateT Game IO ()
モナドにあります。私は IO を使用してユーザー入力を取得します。実際には、すべての IO チャネルが 1 つの関数を介して、
getChoice :: Show a => [ a ] -> IO a
これは、提示されたすべてのオプションをユーザーに促し、応答を読み取り、それを返します。ユーザー応答 (および初期状態) の特定のフローでは、ゲームは決定論的に進行します。これらのユーザー応答を除外して、テストに役立てたいと思います。
これを Pipes を使用するように変換しようとすると、現在 にあるすべてのコードを変更してStateT Game IO ()
で実行するのが最も似ていますProxy p, Monad m => Client p [String] String m ()
。このようにして、ユーザーからの選択を「要求」することができます。これにより、必要に応じてユーザーの選択が提供されると仮定して、ブロック スタイルでエンジン コードを記述できます。
しかし、これは間違っているようです。ユーザーはクライアントであり、ゲーム エンジンはサーバーである必要があります。この区別を正しく行うために、どのような原則を使用できますか?