{-# LANGUAGE AllowAmbiguousTypes #-}
module Data.Effect.Fail (
module Data.Effect.Fail,
Fail (..),
)
where
import Control.Monad.IO.Class (liftIO)
import Data.Effect (Emb, Fail (Fail))
import Prelude hiding (fail)
import Prelude qualified as IO
makeEffectF_' (def & noGenerateLabel & noGenerateOrderInstance) ''Fail
runFailIO
:: forall es a ff c
. (Emb IO :> es, Monad (Eff ff es), Free c ff)
=> Eff ff (Fail ': es) a
-> Eff ff es a
runFailIO :: forall (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(Emb IO :> es, Monad (Eff ff es), Free c ff) =>
Eff ff (Fail : es) a -> Eff ff es a
runFailIO = (Fail ~~> Eff ff es) -> Eff ff (Fail : es) a -> Eff ff es a
forall (e :: Effect) (es :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
(e ~~> Eff ff es) -> Eff ff (e : es) a -> Eff ff es a
interpret \(Fail String
s) -> IO x -> Eff ff es x
forall a. IO a -> Eff ff es a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO x -> Eff ff es x) -> IO x -> Eff ff es x
forall a b. (a -> b) -> a -> b
$ String -> IO x
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
IO.fail String
s
{-# INLINE runFailIO #-}