【问题标题】:Looking for `flatten :: Event [a] -> Event a` in Reactive Banana在 Reactive Banana 中寻找`flatten :: Event [an] -> Event a`
【发布时间】:2016-04-29 16:46:24
【问题描述】:

我正在寻找类似flatten :: Event [a] -> Event a 的东西(如果需要,可以将[]Foldable f => f 交换),这将为Event 列表中的每个a 生成一个单独的事件,例如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 会阻塞直到有订阅者,还是会在没有订阅者时立即返回?

编辑 2

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

【问题讨论】:

    标签: haskell reactive-banana


    【解决方案1】:

    这似乎是不可能的。根据the notes in Heinrich Apfelmus's blogEvent 不支持同时发生。这是一个相对较新的变化;该帖子发布于去年 8 月,v1.0 于 10 月发布。几年前我最初学习 Reactive Banana 时肯定不是这种情况。

    但首先,Event [a] 似乎是表示一组巧合事件的合理方式。为什么需要将其展平?

    【讨论】:

    • 我想为每个as(获取/克隆 git 存储库)执行一个IO 操作,然后在每个操作之后执行下游代码(例如,构建和基准测试项目)。我更喜欢以“深度优先”(运行相应的获取并连续构建)而不是“广度优先”的方式(运行所有获取,然后运行所有构建)。还有其他事件源会产生单个 as,但我当然可以将其包装在单例列表中。
    • 实际上,我认为 IO 是唯一在语义上重要的事情。
    • 我认为fmap (traverse (clone &gt;=&gt; build)) :: Event [Project] -&gt; Event (IO ()) 会这样做,不是吗?
    • 是的,但我宁愿将clonebuild 分开为它们自己的事件/箭头,因为build 也可以由其他事件触发。不过谢谢你的建议,我去试试看。
    • 事件不支持同时发生。顺便说一下,更新版本的钠也是这种情况。
    猜你喜欢
    • 2012-07-29
    • 2022-12-14
    • 2019-09-18
    • 2021-04-27
    • 2017-03-11
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多