Skip to content
Snippets Groups Projects
ShortIO.hs 1.34 KiB
Newer Older
module Quasar.Utils.ShortIO (
  ShortIO,
  runShortIO,
  unsafeShortIO,

  forkIOShortIO,
  forkIOWithUnmaskShortIO,
  throwToShortIO,
Jens Nolte's avatar
Jens Nolte committed
  newUniqueShortIO,

  -- ** Some specific functions required internally
  peekAwaitableShortIO,
Jens Nolte's avatar
Jens Nolte committed
  newAsyncVarShortIO,
  putAsyncVarShortIO_,
) where

import Control.Monad.Catch
import Quasar.Awaitable
import Quasar.Prelude
import Control.Concurrent

newtype ShortIO a = ShortIO (IO a)
  deriving newtype (Functor, Applicative, Monad, MonadThrow, MonadCatch, MonadMask)

runShortIO :: ShortIO a -> IO a
runShortIO (ShortIO fn) = fn

unsafeShortIO :: IO a -> ShortIO a
unsafeShortIO = ShortIO


forkIOShortIO :: IO () -> ShortIO ThreadId
forkIOShortIO fn = ShortIO $ forkIO fn

forkIOWithUnmaskShortIO :: ((forall a. IO a -> IO a) -> IO ()) -> ShortIO ThreadId
forkIOWithUnmaskShortIO fn = ShortIO $ forkIOWithUnmask fn

throwToShortIO :: Exception e => ThreadId -> e -> ShortIO ()
throwToShortIO tid ex = ShortIO $ throwTo tid ex

Jens Nolte's avatar
Jens Nolte committed
newUniqueShortIO :: ShortIO Unique
newUniqueShortIO = ShortIO newUnique


peekAwaitableShortIO :: Awaitable r -> ShortIO (Maybe r)
peekAwaitableShortIO awaitable = ShortIO $ peekAwaitable awaitable

Jens Nolte's avatar
Jens Nolte committed
newAsyncVarShortIO :: ShortIO (AsyncVar a)
newAsyncVarShortIO = ShortIO newAsyncVar

putAsyncVarShortIO_ :: AsyncVar a -> a -> ShortIO ()
putAsyncVarShortIO_ var value = ShortIO $ putAsyncVar_ var value