newAddHandler
使用這樣的:
do (addHandler, fire) <- newAddHandler
...
addHandler
是AddHandler的傳遞給reactive-banana
,和fire
是a -> IO()
型(其中一個是您的事件類型)觸發事件的函數。
例如,您可能會安裝fire
爲回調GLFW的鼠標按鈕的事件,像這樣:
registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
(addHandler, fire) <- newAddHandler
setMouseButtonCallback $ \button _ -> fire button
fromAddHandler addHandler
(我不跟GLFW經歷過,所以我不知道什麼是第二參數setMouseButtonCallback
的回調是 - 如果它是很重要的,你需要適當地修改這個實現)
的AddHandler
僅僅是一個函數,它接受一個回調 - a -> IO()
- 並將其註冊爲有問題的事件。它然後回報(從內IO
)的IO()
動作用於註銷此處理,使得complete definition of AddHandler
如下:
type AddHandler a = (a -> IO()) -> IO (IO())
那麼,這是否進來newAddHandler
?簡單:newAddHandler
維護事件的處理程序列表,並在執行fire x
時激活它們。
如果你不需要newAddHandler
,像GTK +等多種常見的工具包,您的工具包已經擁有的設施註冊和註銷多個事件處理程序;如果是這樣,你應該自己編寫一個AddHandler
。但是,如果它支持的只是一個回調,則應該使用newAddHandler
。
請注意,您永遠不需要將AddHandler
s暴露給使用FRP的代碼;它們只是用於從外部輸入創建Event
的內部膠水。
最後點擊!謝謝。 – bzn 2011-12-25 22:26:39
糟糕 - 我最後一次用GUI工具箱使用反應香蕉,我寫了一個短的(約30行)綁定到GTK +,它具有這種功能;我沒有真正使用過wxWidgets,但是認爲它也是如此,因爲爲GTK +實現一個'AddHandler'非常自然:)經過進一步調查,它沒有;我糾正了我的答案。 – ehird 2011-12-25 22:37:52
@bzn:基本上,wxWidgets沒有提供一種方法來再次註銷特定的事件處理程序,這就是爲什麼我必須使用'newAddHandler'實用程序。 – 2011-12-26 08:55:39