6

現在、reactive-banana および react-banana-wx パッケージを使用して、従来の wxHaskell の一部を再設計しています。ただし、動的なネットワーク構築 (MVar でスレッド ブロックに遭遇した場合) を回避するために、必要に応じて可視性を設定する wxHaskell ウィジェットの固定セットを事前に構築することで、これを模倣しています。可視性は、sinkを取る関数によって設定されBehaviorます。ただし、wxHaskell では、これらすべてのウィジェットが を介して適切に変更された後、これらのウィジェットをsink保持するパネルのレイアウトを引き続き変更する必要があります。つまり、sink-ing は実際にはネットワークの一部であるべきであるため、トリガーしてレイアウトの変更を待機できるイベントです。現在のように、sinksinkアクションが完了した後にイベントをトリガーすることはできません。私はこのようなものに適応しようとしました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ですか?

4

1 に答える 1

2

reactimate基本的に、IO アクションが特定の順序で実行されることを確認したいようです。つまり、ウィジェットのプロパティが設定された後にレイアウトが設定されていることを確認する必要があります。

順序を指定するには、いくつかの方法があります。

  1. unionunionWithおよび/またはを使用collectして、同時イベントの順序を決定します。
  2. モナドreactimateに出現する順序で実行されるという事実を使用します。(厳密に言えば、動的イベント切り替えからコンビネーターMomentを使用する場合、これは当てはまりません。)observeE

あなたの特定のケースでは、これらのアイデアは次のように適用できます。

1については、IOアクションを含むイベントを作成し、後でレイアウトと組み合わせることができます

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関数を使用するだけでよく、レイアウトが最後に設定されていることを確認するだけです。

do
    sink widget1 [ visible :== bBool ]
    sink window1 [ layout  :== bLayout ]

モナド内の関数の順序によりsink、レイアウトが最後に設定されることが保証されます。


また、reactive-banana 0.7 以降、動的イベント切り替えを使用して、ウィジェットの可変セットをモデル化できることにも注意してください。デモンストレーションについては、 BarTab.hs の例を参照してください。この例では、レイアウトも設定しています。

動的ネットワークを使用すると、MVar ブロックに遭遇することがわかりました。これはおそらく、ネットワーク内の別のイベントをトリガーする方法でウィジェットを作成したためです。残念ながら、これは意味的に不健全であり、将来のバージョンに応じた値に対応し、プログラムはどん底に突き落とされます。

于 2012-11-27T16:46:46.317 に答える