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 ()
, используемое для отмены регистрации этого обработчика, в результате чего полное определение AddHandler
читается следующим образом:
type AddHandler a = (a -> IO ()) -> IO (IO ())
Так откуда же появляется newAddHandler
?Просто: newAddHandler
поддерживает список обработчиков для события и активирует их при выполнении fire x
.
Вам не нужно newAddHandler
, если, как и GTK +, и многие другие распространенные наборы инструментов, ваш инструментарийуже есть средства для регистрации и отмены регистрации нескольких обработчиков событий;если это так, вы должны написать свою собственную реализацию AddHandler
.Но если все, что он поддерживает, это один обратный вызов, вы должны использовать newAddHandler
.
Обратите внимание, что вам никогда не нужно выставлять AddHandler
s для самого кода, использующего FRP;это просто внутренний клей, используемый для создания Event
s из внешних входов.