getChar
オプションでアクションを中止したいと思います。次の機能が必要です。
getChar' :: (Char -> IO ()) -> IO (IO ())
の場合、文字が使用可能になる前に が呼び出されabort <- getChar' callback
ない限り、文字は標準入力から読み取られます。abort
文字が読み込まcallback
れると、それとともに呼び出されます。
次のプロトタイプ実装があります。
import Control.Monad
import Control.Concurrent
getChar' :: (Char -> IO ()) -> IO (IO ())
getChar' callback = do
v <- newEmptyMVar
tid <- forkIO $ do
c <- getChar
b <- tryPutMVar v ()
when b $ callback c
return $ do
b <- tryPutMVar v ()
when b $ killThread tid
問題は、文字を読み取った後、MVarkillThread
に入れる前にスレッドを中止する可能性があることです。()
この問題を解決する方法がわかりません。基本パッケージで可能ですか? そうでない場合、他のパッケージで同様の機能が実装されているのを見たことがありますか?