polysemy-conc-0.2.0.0: lib/Polysemy/Conc/Critical.hs
-- |Description: Critical interpreters
module Polysemy.Conc.Critical where
import qualified Control.Exception as Exception
import Polysemy.Final (getInitialStateS, interpretFinal, runS)
import Polysemy.Conc.Data.Critical (Critical(..))
import Polysemy (interpretH, runT)
-- |Interpret 'Critical' in terms of 'Final' 'IO'.
interpretCritical ::
Member (Final IO) r =>
InterpreterFor Critical r
interpretCritical =
interpretFinal @IO \case
Catch ma -> do
s <- getInitialStateS
o <- runS ma
pure (run o s)
where
run ma' s =
Exception.catch (fmap Right <$> ma') \ se -> pure (Left se <$ s)
{-# inline interpretCritical #-}
-- |Interpret 'Critical' by doing nothing.
interpretCriticalNull ::
InterpreterFor Critical r
interpretCriticalNull =
interpretH \case
Catch ma ->
fmap (fmap Right) . raise . interpretCriticalNull =<< runT ma
{-# inline interpretCriticalNull #-}