反射:根据行为延迟事件

Reflex: Delaying events based on a behavior

使用 reflex-frp 和 reflex-dom 我需要根据行为延迟事件。 我有:

delayEvent :: (MonadWidget t m, Reflex t) 
           => Event t () -> Behavior t NominalDiffTime -> m (Event t ())
delayEvent e b = switch . current <$> widgetHold (return never) eDelsM
  where
    eDelsM = (`delay` e) <$> b <@ e -- Event t (m (Event t ()))

但是 return 事件永远不会触发。我在这里犯了一个简单的错误还是整个方法需要重新考虑?

显然,延迟永远不会触发,因为当 eDelsM 定义的小部件从事件 e0 激活时,它将等待下一个事件 e1 来创建一个延迟。但是,当事件的下一个实例 e1 触发时,eDelsM 小部件的一个新实例将变为活动状态并开始等待事件的下一个实例 e2。解决方案是在 eDelsM 重新创建后立即触发新事件。

eDelsM = (\t -> getPostBuild >>= delay t) <$> b <@ e