Haskell でリアクティブ バナナを使用して音楽プレーヤーを作成しています。私が抱えている問題の 1 つは、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は部分的な関数であり、再生が実際に開始される前にNothingを返します。問題は、addCmdEventが初めて発生すると、bPositionがまだNothing値を保持していることです。eSetStart/Endは、これに基づいて値を計算します。そうして初めてbPositionが更新され、これが次回の addCmdEvent の起動時に使用される値になります。など、いわば値は常に「1つずれている」ことになります。
関連するSO questionがありますが、その場合、動作の新しい値を計算するために使用できる「トリガー」イベントが存在します。fromPollでそのようなことは可能ですか?