首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reactive banana-wx `sink`不会生成启用接收器后处理的事件

reactive banana-wx `sink`不会生成启用接收器后处理的事件
EN

Stack Overflow用户
提问于 2012-11-27 16:30:41
回答 1查看 230关注 0票数 6

我目前正在使用reactive-banana和reactive-banana-wx包重新设计一段遗留的wxHaskell。但是,为了避免动态网络构造(我在MVar上遇到了线程块),我现在通过预先构造一组固定的wxHaskell小部件来模拟这种情况,我根据需要设置了这些小部件的可见性。可见性是由接受Behaviorsink函数设置的。但是,wxHaskell要求在通过sink适当地修改了所有这些小部件之后,需要对包含这些小部件的面板的布局进行后续更改。这意味着sink-ing实际上应该是网络的一部分,所以它是一个可以触发并等待布局更改的事件。就目前而言,sink会将您“带出”事件网络,因此不可能在sink操作完成后触发事件。我确实尝试过让sink适应这样的情况:

代码语言:javascript
复制
sink' :: Frameworks t =>
    w -> [Prop' t w] -> Moment t (Event t ())
sink' widget props = do
    es <- mapM sink1 props
    return $ unions es
  where
    sink1 (attr :== b) = do
        x <- initial b
        liftIOLater $ set widget [attr := x]
        e <- changes b
        return $ (\x -> unsafePerformIO $ set widget [attr := x]) <$> e

但是,unsafePerformIO没有被执行。如何实现所需的行为,即允许通过Event等待(wxHaskell) IO

EN

回答 1

Stack Overflow用户

发布于 2012-11-28 00:46:46

基本上,您似乎希望确保reactimate中的IO操作按特定顺序执行?也就是说,您希望确保在设置小部件属性之后设置布局。

有几种方法可以指定顺序:

  1. 使用unionunionWith和/或collect来确定并发事件的顺序。
  2. 使用reactimate按照它们在Moment monad中出现的顺序执行。(尽管严格来说,当您使用动态事件切换中的observeE组合器时,情况就不再是这样了。)

在您的特定情况下,可以按如下方式应用这些想法。

对于1,您可以创建一个包含IO操作的事件,并在以后将其与布局相结合

代码语言:javascript
复制
sink' :: Frameworks t =>
    w -> [Prop' t w] -> Moment t (Event t (IO ()))
sink' widget props = do
    es <- mapM sink1 props
    return $ foldr1 (unionWith (>>)) es
  where
    sink1 (attr :== b) = do
        x <- initial b
        liftIOLater $ set widget [attr := x]
        e <- changes b
        return $ (\x -> set widget [attr := x]) <$> e

对于2,您可以简单地使用普通的sink函数,并确保布局是最后设置的。

代码语言:javascript
复制
do
    sink widget1 [ visible :== bBool ]
    sink window1 [ layout  :== bLayout ]

monad中sink函数的排序保证了布局是最后设置的。

还要注意,从reactive banana 0.7开始,您可以使用动态事件切换来对一组可变的小部件进行建模。有关演示,请参阅BarTab.hs example。此示例还设置布局。

您指出在使用动态网络时会遇到MVar块。这可能是因为您创建小部件的方式会触发网络中的另一个事件。不幸的是,这在语义上是不合理的-它对应于取决于自身未来版本的值-程序的反应是陷入谷底。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13580121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档