2012-04-03 2 views
7

Dans reactive-banana, j'ai un flux d'événements qui produit une série de nombres, dont certains se répètent plusieurs fois de suite (je ne suis pas concerné par tous les doublons, juste des doubles séquentiels). Comment puis-je modifier ce flux d'événements pour qu'il ne contienne que des doublons non séquentiels? J'ai essayé d'utiliser des changements pour le convertir en un comportement pensant que le comportement changerait seulement quand l'événement était un nouveau nombre mais au lieu que le comportement déclenche un événement de changement chaque fois qu'un nouvel événement d'entrée est reçu.Comment supprimer les événements répétitifs dans reactive-banana

Répondre

6

Notez que la fonction doit changesne être utilisé pour la liaison à des boîtes à outils de l'interface graphique et analogues, il ne doit pas être utilisé pour la programmation régulière avec les événements et les comportements.

Une fonction qui supresses les occurrences d'événements en double peut être exprimée en termes de mapAccum et filterJust combinators comme suit

skipEqual :: Eq a => Event t a -> Event t a 
skipEqual = filterJust . fst . mapAccum Nothing . fmap f 
    where 
    f y (Just x) = if x == y then (Nothing,Just x) else (Just y,Just y) 
    f y Nothing = (Just y, Just y) 

test = interpretModel skipEqual $ map (:[]) [1 :: Int,1,2,3,3,2] 

Courir test donne

*Main> test 
[[1],[],[2],[3],[],[2]] 

comme vous le souhaitez. En d'autres termes, vous pouvez simplement imaginer Event comme une liste d'occurrences, puis appliquer vos combinateurs "liste" bien-aimés à cela.

+0

Oh, pourquoi ne pas que je pense de cette ?! J'ai supprimé la mise en œuvre moche de ma réponse en faveur de celui-ci. – ehird

+1

Si vous ne deviez pas utiliser les changements, comment faites-vous quelque chose de significatif avec un comportement? – Orclev

+0

@Orclev: Vous pouvez appliquer les comportements aux événements. Les opérateurs '<@>' et '<@' sont utilisés pour cela. En outre, vous pouvez utiliser la récurrence mutuelle entre les comportements et les événements. –

0

Eh bien, changes ne tourne pas quoi que ce soit dans un Behavior; il vous permet d'observer juste les changements d'un Behavior dans NetworkDescription, de sorte que vous pouvez coller à des cadres externes. Le behaviour of changes est décrit comme changes (stepper x e)return (calm e), donc le déclenchement d'un événement par stepper et changes n'aura aucun effet autre que calm (qui supprime simplement toutes les occurrences simultanées mais la première).

Il est utile d'avoir un combinateur pour ignorer les occurrences qui ne changent pas la valeur, et je pense que d'autres frameworks FRP en ont un intégré. Mais vous pouvez écrire les vôtres facilement, comme le montre la réponse de Heinrich.

Questions connexes