newAddHandler 是这样使用的:
do (addHandler, fire) <- newAddHandler
...
addHandler 是要传递给 reactive-banana 的 AddHandler,fire 是触发事件的 a -> IO () 类型的函数(其中 a 是您的事件类型)。 p>
例如,您可能会安装 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 时激活它们。
如果像 GTK+ 和许多其他常用工具包一样,您的工具包已经具备注册和注销多个事件处理程序的功能,则不需要 newAddHandler;如果是这样,您应该编写自己的AddHandler 实现。但是如果它只支持一个回调,你应该使用newAddHandler。
请注意,您永远不需要将AddHandlers 暴露给使用 FRP 的代码本身;它们只是用于从外部输入创建Events 的内部粘合剂。