module Network.QUIC.Windows (
    windowsThreadBlockHack
  ) where

import Control.Concurrent
import qualified Control.Exception as CE
import Control.Monad

windowsThreadBlockHack :: IO a -> IO a
windowsThreadBlockHack :: forall a. IO a -> IO a
windowsThreadBlockHack IO a
act = do
    MVar (Either SomeException a)
var <- forall a. IO (MVar a)
newEmptyMVar :: IO (MVar (Either CE.SomeException a))
    -- Catch and rethrow even async exceptions, so don't bother with UnliftIO
    forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> IO ThreadId
forkIO forall a b. (a -> b) -> a -> b
$ forall e a. Exception e => IO a -> IO (Either e a)
CE.try IO a
act forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. MVar a -> a -> IO ()
putMVar MVar (Either SomeException a)
var
    Either SomeException a
res <- forall a. MVar a -> IO a
takeMVar MVar (Either SomeException a)
var
    case Either SomeException a
res of
      Left  SomeException
e -> forall a. Show a => a -> IO ()
print SomeException
e forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall e a. Exception e => e -> IO a
CE.throwIO SomeException
e
      Right a
r -> forall (m :: * -> *) a. Monad m => a -> m a
return a
r