В настоящее время я переделываю часть устаревшего wxHaskell, используя пакеты reactive-banana и reactive-banana-wx. Однако, чтобы избежать построения динамической сети (где я столкнулся с блокировкой потока в 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) с помощью Event
?