Escribo un reproductor de música en Haskell con plátano reactivo. Un problema que tengo es obtener valores actualizados con fromPoll. Quiero permitir que el usuario seleccione opcionalmente una parte de la pista mientras juega. Mi código es como la siguiente:Reactive-banana: valores actualizados desde 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))
arriba, getPosition es una función parcial, volviendo Nada antes de la reproducción comienza en realidad. El problema es que una vez que el addCmdEvent se dispara por primera vez, bPosition seguirá teniendo un valor Nothing. eSetStart/End calcule sus valores según esto. Solo entonces se actualiza bPosition, y este es el valor que se utilizará la próxima vez que addCmdEvent incendios. Y así sucesivamente, el valor siempre será "off by one", por así decirlo.
Hay un SO question relacionado, pero en ese caso existe un evento "desencadenante" que se puede usar para calcular el nuevo valor del comportamiento. ¿Hay algo como eso con fromPoll?
Cuando hayas terminado, deberías poner el resultado en Hackage. ¡Espero poder escuchar mi música de Haskell! – amindfv
Planeo ponerlo en Hackage una vez (hah) he terminado. Sin embargo, es un tipo de reproductor de música "scratch my own itch" para ayudar con la transcripción de música, por lo que no estoy seguro de lo interesante que sería para otras personas. – oggy