newAddHandlerこのように使用されます:
do (addHandler, fire) <- newAddHandler
...
addHandlerはに渡すAddHandlerreactive-bananaであり、イベントをトリガーするタイプ(aはイベントタイプ)fireの関数です。a -> IO ()
たとえば、次fireのように、GLFWのマウスボタンイベントへのコールバックとしてインストールする可能性があります。
registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
(addHandler, fire) <- newAddHandler
setMouseButtonCallback $ \button _ -> fire button
fromAddHandler addHandler
(私はGLFWの経験がないので、setMouseButtonCallbackコールバックの2番目の引数が何であるかわかりません。重要な場合は、この実装を適切に修正する必要があります。)
AnAddHandlerは、コールバックを受け取る関数です— a -> IO ()—そしてそれを問題のイベントに登録します。次に、このハンドラーの登録を解除するために使用されるアクションを(内部から)返し、読み取りの完全な定義を次のようにします。IOIO ()AddHandler
type AddHandler a = (a -> IO ()) -> IO (IO ())
では、どこからnewAddHandler来るのでしょうか?シンプル:newAddHandlerイベントのハンドラーのリストを維持し、fire x実行時にそれらをアクティブにします。
newAddHandlerGTK +や他の多くの一般的なツールキットのように、ツールキットに複数のイベントハンドラーを登録および登録解除する機能がすでにある場合は必要ありません。含まれている場合は、独自の実装を作成する必要がありますAddHandler。ただし、サポートするのが単一のコールバックだけの場合は、を使用する必要がありますnewAddHandler。
AddHandlerをFRPに公開する必要はないことに注意してください-コード自体を使用します。Eventこれらは、外部入力からを作成するために使用される単なる内部接着剤です。