packages feed

hw-polysemy-0.2.0.0: core/HaskellWorks/Polysemy/Control/Concurrent.hs

module HaskellWorks.Polysemy.Control.Concurrent
  ( ThreadId,
    myThreadId,
    killThread,
    getNumCapabilities,
    threadCapability,
    yield,
    threadDelay,
    isCurrentThreadBound,
    mkWeakThreadId,
  ) where

import           Control.Concurrent            (ThreadId)
import qualified Control.Concurrent            as IO
import           HaskellWorks.Polysemy.Prelude
import           Polysemy
import           System.Mem.Weak               (Weak)

myThreadId :: ()
  => Member (Embed IO) r
  => Sem r ThreadId
myThreadId =
  embed IO.myThreadId

killThread :: ()
  => Member (Embed IO) r
  => ThreadId
  -> Sem r ()
killThread tid =
  embed $ IO.killThread tid

getNumCapabilities :: ()
  => Member (Embed IO) r
  => Sem r Int
getNumCapabilities =
  embed IO.getNumCapabilities

threadCapability :: ()
  => Member (Embed IO) r
  => ThreadId
  -> Sem r (Int, Bool)
threadCapability tid =
  embed $ IO.threadCapability tid

yield :: ()
  => Member (Embed IO) r
  => Sem r ()
yield =
  embed IO.yield

threadDelay :: ()
  => Member (Embed IO) r
  => Int
  -> Sem r ()
threadDelay n =
  embed $ IO.threadDelay n

isCurrentThreadBound :: ()
  => Member (Embed IO) r
  => Sem r Bool
isCurrentThreadBound =
  embed IO.isCurrentThreadBound

mkWeakThreadId :: ()
  => Member (Embed IO) r
  => ThreadId
  -> Sem r (Weak ThreadId)
mkWeakThreadId tid =
  embed $ IO.mkWeakThreadId tid