Я хотел бы создать Behavior t a
из IO a
с предполагаемой семантикой, что действие IO будет выполняться каждый раз, когда поведение sample
d:
{- 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
для непрерывного явления, наблюдаемого в любое время?