{-# LANGUAGE AllowAmbiguousTypes #-}

-- SPDX-License-Identifier: MPL-2.0

{- |
Copyright   :  (c) 2025 Sayo contributors
License     :  MPL-2.0 (see the file LICENSE)
Maintainer  :  ymdfield@outlook.jp
-}
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 #-}