動作がdになるたびに IO アクションが実行されるという意図されたセマンティクスを使用して、 Behavior t afromを作成したいと思います。IO asample
{- language FlexibleContexts #-}
import Reflex.Dom
import Control.Monad.Trans
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
を実行するだけでこれができることを願っていmeasurementましたpull:
onDemand measure = return $ pull (liftIO measure)
ただし、Behavior最初のmeasureメンションの後、結果は決して変わりません。
私が思いついた回避策は、Behavior「十分に頻繁に」変更されるダミーを作成し、それに偽の依存関係を作成することでした。
import Data.Time.Clock as Time
hold_ :: (MonadHold t m, Reflex t) => Event t a -> m (Behavior t ())
hold_ = hold () . (() <$)
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
onDemand measure = do
now <- liftIO Time.getCurrentTime
tick <- hold_ =<< tickLossy (1/1200) now
return $ pull $ do
_ <- sample tick
liftIO measure
これは期待どおりに機能します。ただし、Behaviorとにかくオンデマンドでのみサンプリングできるため、これは必要ありません。
Behavior継続的でいつでも観測可能な現象を作成する正しい方法は何ですか?