{-#选项-cpp#-}
----------------------------------------------------------------------
-- |
--模块:GF.系统。使用信号
--维护人员:比约恩·布林特
--稳定性:(稳定性)
--便携性:(便携性)
--
-->CVS$日期:2005/11/11 11:12:50$
-->CVS$作者:bringert$
-->CVS$版本:1.1$
--
--允许SIGINT(Ctrl-C)中断计算。
-----------------------------------------------------------------------------

模块 GF.系统。使用信号 哪里

进口 控制。同时发生的 (我的线程ID, killThread线程)
进口 控制。例外 (有些例外,抓住)
进口 前奏曲 躲藏 (抓住)
--导入系统。IO(输入输出)#ifdef明w32_HOST_OS进口 全球总部。控制台处理程序

myInstallHandler(我的安装处理程序) 处理程序 = 安装处理程序 处理程序
我的捕获  = 捕捉 . 常数
my忽略 = 忽略#其他进口 系统。Posix公司。信号

myInstallHandler::处理程序->IO处理程序myInstallHandler(我的安装处理程序) 处理程序处理程序 = 信号->处理程序->可能的信号集->IO处理程序安装处理程序 信号信号INT 处理程序处理程序 可能是信号集对所有人来说。也许是什么都没有
myCatch::IO()->处理程序我的捕获  = IO()->处理程序捕捉
myIgnore::处理程序my忽略 = 处理程序忽略#结尾
{-#无线 可中断运行 #-}

--|运行IO操作,并允许其中断
--由SIGINT发送到当前进程。退换商品
--进程未完成时出现异常
--正常情况下。
--注:
--*这将取代任何现有SIGINT
--处理程序。计算后
--已完成,将还原现有处理程序。
--*如果IO操作是惰性的(例如,使用readFile,
--unsafeInterleaveIO等)延迟计算将
--不会被打断,因为它将被执行
--删除信号处理程序后。
可中断运行 :: IO(输入输出)  -> IO(输入输出) (要么 有些例外 )
可中断运行::IO a->IO(或SomeException a)可中断运行 IO a(输入输出) = 
     线程IDt吨 <- IO线程ID我的线程ID
       处理程序旧H <- 处理程序->IO处理程序myInstallHandler(我的安装处理程序) (IO()->处理程序我的捕获 (线程ID->IO()killThread线程 线程IDt吨))
       或者SomeExceptionx个 <- IO(SomeException a)对于所有a.IO(a或a)第页 IO(SomeException之一)->(SomeException->IO(Some异常a))->IO(SomeException a)对于所有e a。异常e=>IO a->(e->IO a)->IO a`捕捉` SomeException->IO(或者SomeExction a)对于所有(m::*->*)a b.Monad m=>a->m(a或b)小时
       处理程序->IO处理程序myInstallHandler(我的安装处理程序) 处理程序旧H
       或者SomeException a->IO(或者SomeExeption a)对于所有(m::*->*)a.Monad m=>a->ma返回 或者SomeExceptionx个
  哪里 p::IO(a或a)第页 = IO a(输入输出) IO a->(a->IO(a或a))->IO(b或a)对于所有(m::*->*)a b.Monad m=>m a->(a->m b)->m b>>= \x个 -> a->IO(a或a)对于所有(m::*->*)a.Monad m=>a->ma返回 (a->IO(a或a))->a->IO对于所有a b(a->b)->a->b$! a->要么a对于所有b.b->要么a b赖特 (a->a)->a->a对于所有a b(a->b)->a->b$! x个
        h::a->m(a或b)小时 e(电子) = 要么a b->m(要么a b)对于所有(m::*->*)a.Monad m=>a->ma返回 (b->m(b中任一个))->b->m中任一个(b中任意一个)对于所有a b(a->b)->a->b$ a->要么a b对于所有的b.a->要么a b左侧 e(电子)

--|类似于“runInterruptibly”,但始终返回(),无论
--计算是否失败。
可中断运行_ 时间: IO(输入输出) () -> IO(输入输出) ()
运行可中断_::IO()->IO()可中断运行_ = (SomeException()->())->IO(SomeException())->IO()对于所有(f::*->*)a b.函数f=>(a->b)->fa->fb功能性维修计划 ((某些异常->())->(()->())->任一SomeException()->对于所有c b(a->c)->(b->c)->b->c中的任何一个任何一个 (()->某些异常->()对于所有a b.a->b->a常数 ()) () -> ()对于所有a.a->a身份证件) (IO(SomeException())->IO())->(IO()->IO(或SomeException()))->IO()->IO()对于所有的b c a。(b->c)->(a->b)->a->c. IO()->IO(或SomeException())对于所有a.IO a->IO(或SomeException a)可中断运行

--|在阻止SIGINT的情况下运行操作。
块中断 :: IO(输入输出)  -> IO(输入输出) 
blockInterrupt::IO a->IO a块中断::IO a块中断 IO a(输入输出) = 
     处理程序旧H <- 处理程序->IO处理程序myInstallHandler(我的安装处理程序) 处理程序myIgnore(我忽略)
       x个 <- IO a(输入输出)
       处理程序->IO处理程序myInstallHandler(我的安装处理程序) 处理程序旧H
       a->IO a对于所有(m::*->*)a.Monad m=>a->ma返回 x个