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)