2011-12-25 1 views
14

J'essaie actuellement de connaître FRP à travers reactive-banana de Heinrich Apfelmus, qui semble être une bibliothèque assez bien documentée et simple, comparée aux autres que j'ai regardées.reactive-banana: Comment créer un AddHandler?

Cependant, je ne peux pas envelopper ma tête autour du type AddHandler. Disons que je veux utiliser GLFW pour obtenir des clics de souris afin que j'ai quelque chose comme eMouseButton :: Event(). En regardant les exemples, il semble que je devrais utiliser fromAddHandler, mais je ne sais pas comment assembler cet argument AddHandler. Je pense que je vais devoir utiliser newAddHandler d'une manière ou d'une autre, mais comment?

Je suppose qu'un exemple de la façon de se connecter reactive-banana à quelque chose d'autre que wx aiderait beaucoup.

Répondre

14

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.

+0

Enfin, il a cliqué! Je vous remercie. – bzn

+0

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

+0

@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'. –

Questions connexes