我想有选择地中止一个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
问题是killThread
在读取字符后但在放入()
MVar 之前可能会中止线程。
我不知道如何解决这个问题,基本包有可能吗?如果没有,您是否看到其他包中实现了类似的功能?