module HaskellWorks.Polysemy.Control.Concurrent.QSem
  ( QSem,

    newQSem,
    waitQSem,
    signalQSem,
    bracketQSem,
  ) where

import           Control.Concurrent.QSem       (QSem)
import qualified Control.Concurrent.QSem       as IO
import           HaskellWorks.Polysemy.Prelude
import           Polysemy
import           Polysemy.Resource

newQSem :: ()
  => Member (Embed IO) r
  => Int
  -> Sem r QSem
newQSem :: forall (r :: EffectRow). Member (Embed IO) r => Int -> Sem r QSem
newQSem Int
n = do
  IO QSem -> Sem r QSem
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO QSem -> Sem r QSem) -> IO QSem -> Sem r QSem
forall a b. (a -> b) -> a -> b
$ Int -> IO QSem
IO.newQSem Int
n

waitQSem :: ()
  => Member (Embed IO) r
  => QSem
  -> Sem r ()
waitQSem :: forall (r :: EffectRow). Member (Embed IO) r => QSem -> Sem r ()
waitQSem QSem
sem =
  IO () -> Sem r ()
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ QSem -> IO ()
IO.waitQSem QSem
sem

signalQSem :: ()
  => Member (Embed IO) r
  => QSem
  -> Sem r ()
signalQSem :: forall (r :: EffectRow). Member (Embed IO) r => QSem -> Sem r ()
signalQSem QSem
sem =
  IO () -> Sem r ()
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ QSem -> IO ()
IO.signalQSem QSem
sem

bracketQSem :: ()
  => Member (Embed IO) r
  => Member Resource r
  => QSem
  -> Sem r a
  -> Sem r a
bracketQSem :: forall (r :: EffectRow) a.
(Member (Embed IO) r, Member Resource r) =>
QSem -> Sem r a -> Sem r a
bracketQSem QSem
sem =
  Sem r () -> Sem r () -> Sem r a -> Sem r a
forall (r :: EffectRow) a b c.
Member Resource r =>
Sem r a -> Sem r b -> Sem r c -> Sem r c
bracket_ (QSem -> Sem r ()
forall (r :: EffectRow). Member (Embed IO) r => QSem -> Sem r ()
waitQSem QSem
sem) (QSem -> Sem r ()
forall (r :: EffectRow). Member (Embed IO) r => QSem -> Sem r ()
signalQSem QSem
sem)