Ich schreibe einen Musik-Player in Haskell mit reactive-banana. Ein Problem, das ich habe, ist, aktuelle Werte mit fromPoll abzurufen. Ich möchte dem Benutzer ermöglichen, optional einen Teil der Spur während der Wiedergabe auszuwählen. Mein Code sieht in etwa wie folgt aus:Reactive-Banane: aktuelle Werte von 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))
Oben, getPosition ist eine Teilfunktion, Rückkehr Nichts, bevor die Wiedergabe tatsächlich beginnt. Das Problem ist, dass, sobald die addCmdEvent Feuer zum ersten Mal, bPosition werden immer noch einen Nichts Wert halten. eSetStart/Ende berechnen Sie ihre Werte auf dieser Grundlage. Nur dann wird bPosition aktualisiert, und dies ist der Wert, der beim nächsten Mal verwendet wird, das addCmdEvent ausgelöst wird. Und so weiter, der Wert wird sozusagen immer "um eins" sein.
Es gibt eine verwandte SO question, aber in diesem Fall gibt es ein "Trigger" -Ereignis, das verwendet werden kann, um den neuen Wert des Verhaltens zu berechnen. Ist so etwas mit fromPoll möglich?
Wenn Sie fertig sind, sollten Sie das Ergebnis auf Hackage setzen. Ich freue mich darauf, meine Musik von Haskell zu spielen! – amindfv
Ich plane, es einmal auf Hackage zu setzen (hah) Ich bin fertig. Es ist jedoch ein "Scratch My Eitch" Art von Musik-Player, um mit Transkribieren von Musik zu helfen, so dass ich nicht sicher bin, wie interessant es für andere Menschen wäre. – oggy