module Cooked.MockChain.GenerateTx.Common
  ( throwOnMaybe,
    throwOnString,
    throwOnToCardanoErrorOrApply,
    throwOnToCardanoError,
  )
where

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

-- | Throws a general error from a String.
throwOnString :: (MonadError MockChainError m) => String -> m a
throwOnString :: forall (m :: * -> *) a.
MonadError MockChainError m =>
String -> m a
throwOnString = MockChainError -> m a
forall a. MockChainError -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (MockChainError -> m a)
-> (String -> MockChainError) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenerateTxError -> MockChainError
MCEGenerationError (GenerateTxError -> MockChainError)
-> (String -> GenerateTxError) -> String -> MockChainError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> GenerateTxError
GenerateTxErrorGeneral

-- | Lifts a 'Nothing' as an error with an associated message.
throwOnMaybe :: (MonadError MockChainError m) => String -> Maybe a -> m a
throwOnMaybe :: forall (m :: * -> *) a.
MonadError MockChainError m =>
String -> Maybe a -> m a
throwOnMaybe String
errorMsg = m a -> (a -> m a) -> Maybe a -> m a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> m a
forall (m :: * -> *) a.
MonadError MockChainError m =>
String -> m a
throwOnString String
errorMsg) a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return

-- | Lifts a '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
. GenerateTxError -> MockChainError
MCEGenerationError (GenerateTxError -> MockChainError)
-> (ToCardanoError -> GenerateTxError)
-> ToCardanoError
-> MockChainError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ToCardanoError -> GenerateTxError
ToCardanoError 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 '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