packages feed

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 #-}