Я пишу музыкальный плеер в Haskell с реактивным бананом. Одна из проблем, с которой я сталкиваюсь, - это получение актуальных значений с помощью метода fromPoll. Я хочу, чтобы пользователь мог дополнительно выбрать часть трека во время игры. Мой код выглядит примерно так:Реактивно-банановые: обновленные значения 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))
Выше GetPosition является частичной функцией, не возвращая ничего до воспроизведения на самом деле начинается. Проблема в том, что как только addCmdEvent срабатывает в первый раз, bPosition по-прежнему будет содержать Nothing значение. eSetStart/End вычислить их значения на основе этого. Только тогда bPosition обновляется, и это значение, которое будет использоваться в следующий раз, когда addCmdEvent пожаров. И так далее, ценность всегда будет «отключена на один», так сказать.
Существует связанный SO question, но в этом случае существует событие «триггер», которое может использоваться для вычисления нового значения поведения. Есть что-то подобное с помощью Poll?
Когда вы закончите, вы должны поместить результат в Hackage. С нетерпением ждем, чтобы сыграть мою музыку с Haskell! – amindfv
Я планирую однажды поставить его на Hackage (hah). Я закончил. Однако это музыкальный проигрыватель «царапины мой собственный зуд», чтобы помочь с расшифровкой музыки, поэтому я не уверен, насколько интересно было бы другим людям. – oggy