Pipes.Concurrent を使用して、GTK で短い GUI プログラムを作成しています。マインスイーパ風のゲームなので、ボタンのグリッドを作成しています。
ボタンを作成して接続します。
b <- buttonNewWithLabel (show $ adjacencies board ! i)
on b buttonActivated
$ void . atomically $ send output (ClickSignal i (mines board ! i))
return b
そして、パイプを次のように接続します。
(output, input) <- spawn (latest (ClickSignal 0 False))
let run = do
sig <- await
case sig of
ClickSignal i isMine ->
if isMine
then do
lift $ labelSetText info (show i ++ " -- LOSE!")
else do
lift $ labelSetText info (show i ++ " -- Ok")
run
Empty -> do
lift $ labelSetText info "Empty Case"
run
void . forkIO $ do
runEffect $ fromInput input >-> run
performGC
ほぼ期待通りに動いています。しかし、ボタン 1 をクリックしても何も起こりません。しかし、ボタン 23 を押すと、情報ラベルが「1..」に更新されます。別のボタンをクリックすると、「23..」などに更新されます。
並行パイプがどのように機能するかを理解できていないか、遅延 IO が何か変なことをしているのではないかと思います。