{-# LANGUAGE GADTs #-} {-# LANGUAGE RankNTypes #-} module System.Timeout.Event where import qualified GHC.Event data TimerManager2 a = TimerManager2 { timerManager :: a , registerTimeout :: a -> Int -> GHC.Event.TimeoutCallback -> IO GHC.Event.TimeoutKey , updateTimeout2 :: a -> GHC.Event.TimeoutKey -> Int -> IO () , unregisterTimeout :: a -> GHC.Event.TimeoutKey -> IO () } data SomeTimerManager2 where SomeTimerManager2 :: TimerManager2 a -> SomeTimerManager2 newTimeoutManager2 :: IO SomeTimerManager2 newTimeoutManager2 = do tm <- GHC.Event.getSystemTimerManager return $! (SomeTimerManager2 (TimerManager2 tm GHC.Event.registerTimeout GHC.Event.updateTimeout GHC.Event.unregisterTimeout)) withTimeoutManager2 :: forall r . (forall a . TimerManager2 a -> IO r) -> IO r withTimeoutManager2 f = do SomeTimerManager2 tm' <- newTimeoutManager2 f tm'