在 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 blog,Event
不支持同时出现。这是一个相对较新的变化; post 的日期是去年 8 月,v1.0 是在 10 月发布的。几年前我最初学习 Reactive Banana 时肯定不是这样。
但是 Event [a]
似乎首先是表示一组巧合事件的合理方式。为什么需要压扁它?
我正在寻找类似 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 blog,Event
不支持同时出现。这是一个相对较新的变化; post 的日期是去年 8 月,v1.0 是在 10 月发布的。几年前我最初学习 Reactive Banana 时肯定不是这样。
但是 Event [a]
似乎首先是表示一组巧合事件的合理方式。为什么需要压扁它?