simpoole-0.2.0: lib/Simpoole/Internal.hs
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Simpoole.Internal (FailToIO (..), failToIO) where
import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
import Control.Monad.Conc.Class (MonadConc)
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Coerce (coerce)
newtype FailToIO m a = FailToIO (m a)
deriving newtype
( Functor
, Applicative
, Monad
, MonadIO
, MonadThrow
, MonadCatch
, MonadMask
, MonadConc
)
instance MonadIO m => MonadFail (FailToIO m) where
fail = liftIO . fail
{-# INLINE fail #-}
failToIO :: FailToIO m a -> m a
failToIO = coerce
{-# INLINE failToIO #-}