Reactive-banana有一个名为stepper
(类型为MonadMoment m => a -> Event a -> m (Behavior a)
)的函数,它将事件转换为行为值为最后一个事件值的行为,如果不是则为初始值事件已经发生。
在Conal Elliott的一次演讲中,我不记得这个名字,他将此视为事件和行为的基本操作之一。但是,我在netwire中找不到类似的功能。由于我对netwire的理解有限,我希望它有类型:
a -> Wire s e m (Event a) a
答案 0 :(得分:2)
我正在寻找的功能称为hold
, in Control.Wire.Interval
。
这不需要初始值,因为线路会在收到第一个事件之前禁止。如果需要这种行为,可以像这样实现
stepper init = hold <|> pure init
答案 1 :(得分:0)
我只能猜到为什么netwire没有提供。 Control.Wire.Event
中的所有内容都会将结果保存在Event
中,以保留对其发生时间的了解。
您可以使用切换Control.Wire.Switch
中的一种方法退出Event
。您正在寻找rSwitch
。
-- Beware: untested, untype-checked code
stepper :: (Monad m) => a -> Wire s e m (Event a) a
stepper init = switcher . source
where
-- source :: Wire s e m (Event a) ((), Event (Wire s e m () a))
source = arr (\e -> ((), pure <$> e))
-- switcher :: Wire s e m ((), Event (Wire s e m () a)) a
switcher = rSwitch (pure init)
在上面的代码中,pure
用作a -> Wire s e m () a
来创建琐碎的电线。