動作がdになるたびに IO アクションが実行されるという意図されたセマンティクスを使用して、 Behavior t a
fromを作成したいと思います。IO a
sample
{- 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
継続的でいつでも観測可能な現象を作成する正しい方法は何ですか?