newAddHandler
est utilisé comme ceci:
do (addHandler, fire) <- newAddHandler
...
addHandler
est le AddHandler pour passer à reactive-banana
et fire
est une fonction de type a -> IO()
(où un est votre type d'événement) qui déclenche l'événement.
Par exemple, vous probablement installer fire
comme le rappel à l'événement bouton de la souris de GLFW, comme ceci:
registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
(addHandler, fire) <- newAddHandler
setMouseButtonCallback $ \button _ -> fire button
fromAddHandler addHandler
(je ne suis pas connu avec GLFW, donc je ne suis pas sûr de ce que la seconde argument de rappel de setMouseButtonCallback
est - s'il est important, vous aurez besoin de modifier cette mise en œuvre de façon appropriée)
un AddHandler
est juste une fonction qui prend un rappel - a -> IO()
- et il enregistre pour l'événement en question. Il a ensuite retours (à l'intérieur IO
) une action IO()
utilisé pour deregister ce gestionnaire, ce qui rend le complete definition of AddHandler
comme suit:
type AddHandler a = (a -> IO()) -> IO (IO())
Alors, où newAddHandler
à venir? Simple: newAddHandler
gère une liste de gestionnaires pour un événement et les active lorsque fire x
est exécuté.
Vous n'avez pas besoin de newAddHandler
si, à l'instar de GTK + et de nombreux autres outils courants, votre boîte à outils dispose déjà d'installations pour enregistrer et désenregistrer plusieurs gestionnaires d'événements; Si c'est le cas, vous devez écrire votre propre implémentation d'un AddHandler
. Mais si tout ce qu'il supporte est un rappel unique, vous devez utiliser newAddHandler
.
Notez que vous n'avez jamais besoin d'exposer AddHandler
au code FRP lui-même; ils sont juste de la colle interne utilisée pour créer Event
s à partir d'entrées externes.
Enfin, il a cliqué! Je vous remercie. – bzn
Oups - la dernière fois que j'ai utilisé reactive-banana avec une boîte à outils graphique, j'ai écrit une liaison courte (~ 30 lignes) à GTK +, qui a cette fonctionnalité; Je n'ai pas vraiment utilisé wxWidgets, mais j'ai supposé que c'était aussi le cas, car l'implémentation d'un 'AddHandler' pour GTK + était si naturelle :) Après une enquête plus poussée, ce n'est pas le cas; J'ai corrigé ma réponse. – ehird
@bzn: En fait, wxWidgets n'offrait pas un moyen de désenregistrer à nouveau des gestionnaires d'événements spécifiques, c'est pourquoi j'ai dû utiliser l'utilitaire 'newAddHandler'. –