我目前正在使用 reactive-banana 和 reactive-banana-wx 包重新设计一个遗留的 wxHaskell。然而,为了避免动态网络构建(我遇到了 MVar 上的线程块),我现在通过预先构建一组固定的 wxHaskell 小部件来模拟这一点,我根据需要设置了这些小部件的可见性。可见性由sink
采用Behavior
. 但是,wxHaskell 要求在所有这些小部件都通过 适当地修改sink
之后,需要随后更改包含这些小部件的面板的布局。这意味着sink
-ing 实际上应该是网络的一部分,因此它是一个可以触发并等待布局更改的事件。就目前而言,一个sink
sink
将您“带出”事件网络,操作完成后无法触发事件。我确实尝试过适应sink
这样的事情:
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
并没有被执行。如何实现所需的行为,即允许(wxHaskell)IO 通过Event
?