-- | Common utilities used to transfer generation errors raised by plutus-ledger
-- into instances of 'MockChainError'
module Cooked.MockChain.GenerateTx.Common
  ( throwOnToCardanoErrorOrApply,
    throwOnToCardanoError,
  )
where

import Control.Monad.Except
import Cooked.MockChain.BlockChain
import Ledger.Tx qualified as Ledger

-- | Lifts a 'Ledger.ToCardanoError' with an associated error message, or apply a
-- function if a value exists.
throwOnToCardanoErrorOrApply :: (MonadError MockChainError m) => String -> (a -> b) -> Either Ledger.ToCardanoError a -> m b
throwOnToCardanoErrorOrApply :: forall (m :: * -> *) a b.
MonadError MockChainError m =>
String -> (a -> b) -> Either ToCardanoError a -> m b
throwOnToCardanoErrorOrApply String
errorMsg a -> b
f = (ToCardanoError -> m b)
-> (a -> m b) -> Either ToCardanoError a -> m b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (MockChainError -> m b
forall a. MockChainError -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (MockChainError -> m b)
-> (ToCardanoError -> MockChainError) -> ToCardanoError -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ToCardanoError -> MockChainError
MCEToCardanoError String
errorMsg) (b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> (a -> b) -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)

-- | Lifts a 'Ledger.ToCardanoError' with an associated error message, or leaves
-- the value unchanged if it exists.
throwOnToCardanoError :: (MonadError MockChainError m) => String -> Either Ledger.ToCardanoError a -> m a
throwOnToCardanoError :: forall (m :: * -> *) a.
MonadError MockChainError m =>
String -> Either ToCardanoError a -> m a
throwOnToCardanoError = (String -> (a -> a) -> Either ToCardanoError a -> m a)
-> (a -> a) -> String -> Either ToCardanoError a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> (a -> a) -> Either ToCardanoError a -> m a
forall (m :: * -> *) a b.
MonadError MockChainError m =>
String -> (a -> b) -> Either ToCardanoError a -> m b
throwOnToCardanoErrorOrApply a -> a
forall a. a -> a
id