J'écris un lecteur de musique dans Haskell avec réactif-banane. Un problème que j'ai est de récupérer des valeurs à jour avec fromPoll. Je veux permettre à l'utilisateur de sélectionner en option une partie de la piste en jouant. Mon code ressemble à ceci:Reactive-banana: les valeurs à jour de fromPoll
makePlayNetworkDescr :: Player a => AddHandler Command -> a -> NetworkDescription t()
makePlayNetworkDescr addCmdEvent player = do
bPosition <- fromPoll (getPosition player)
eCmds <- fromAddHandler addCmdEvent
let eSetStart = filterE (isJust) $ bPosition <@ filterE (==SetStart) eCmds
eSetEnd = filterE (isJust) $ bPosition <@ filterE (==SetEnd) eCmds
eClearRange = filterE (==ClearRange) eCmds
bStart = accumB Nothing ((const <$> eSetStart) `union` (const Nothing <$ eClearRange))
bEnd = accumB Nothing ((const <$> eSetEnd) `union` (const Nothing <$ eClearRange))
Au-dessus, getPosition est une fonction partielle, retour Rien avant la lecture commence réellement. Le problème est qu'une fois que le addCmdEvent se déclenche pour la première fois, bPosition contiendra toujours une valeur Nothing. eSetStart/End calculer leurs valeurs en fonction de cela. Alors seulement bPosition est mis à jour, et c'est la valeur qui sera utilisée la prochaine fois que addCmdEvent déclenche. Et ainsi de suite, la valeur sera toujours "éteint par un", pour ainsi dire.
Il existe un SO question associé, mais dans ce cas il existe un événement "trigger" qui peut être utilisé pour calculer la nouvelle valeur du comportement. Est-ce que quelque chose comme ça est possible avec fromPoll? À partir de réactif-banana-0.5 et 0.6, la fonction fromPoll
met à jour le comportement chaque fois qu'un événement externe déclenche le réseau d'événements.
Lorsque vous avez terminé, vous devriez mettre le résultat sur Hackage. Au plaisir de jouer ma musique de Haskell! – amindfv
Je prévois de le mettre sur Hackage une fois (hah) j'ai fini. Cependant, c'est un type de lecteur de musique qui aide à transcrire de la musique, donc je ne suis pas sûr que ce soit intéressant pour d'autres personnes. – oggy