在 Reactive Banana 中寻找 `flatten :: Event [an] -> Event a`

Looking for `flatten :: Event [a] -> Event a` in Reactive Banana

我正在寻找类似 flatten :: Event [a] -> Event a 的东西(如果需要,可以将 [] 换成 Foldable f => f),它会为 a 中的每个 a 生成一个单独的事件=15=] 的列表,例如 split in an old version of sodium.

我怀疑 switchE 可以做到这一点,但我需要一个 [a] -> Event a.

类型的函数

我可以用 newEvent 自己制作,但是 reactive-banana 有内置函数吗?

编辑:

实际上,我不太确定我能否用 newEvent 实现它。

flatten :: Foldable f => f a -> Banana.MomentIO (Banana.Event a)
flatten xs = do
  (event, fire) <- Banana.newEvent
  liftIO $ forkIO $ mapM_ fire xs
  return event 

fire 会一直阻塞直到有订阅者,还是会在没有订阅者时立即return?

编辑 2:

看看 implementation of newAddHandler 我上面的实现是行不通的,因为所有事件都可能在任何处理程序可以注册之前被触发。

这似乎是不可能的。根据the notes in Heinrich Apfelmus's blogEvent不支持同时出现。这是一个相对较新的变化; post 的日期是去年 8 月,v1.0 是在 10 月发布的。几年前我最初学习 Reactive Banana 时肯定不是这样。

但是 Event [a] 似乎首先是表示一组巧合事件的合理方式。为什么需要压扁它?