module Hydra.Cardano.Api.CtxTx where

import Hydra.Cardano.Api.Prelude
import Hydra.Cardano.Api.TxOut (modifyTxOutDatum)

-- | A convenient type-class for transforming types in 'CtxUTxO' to 'CtxTx'.
--
-- See also 'ToUtxoContext' for the reverse.
class ToTxContext f where
  toTxContext :: f CtxUTxO era -> f CtxTx era

instance ToTxContext TxOutDatum where
  toTxContext :: forall era. TxOutDatum CtxUTxO era -> TxOutDatum CtxTx era
toTxContext = \case
    TxOutDatum CtxUTxO era
TxOutDatumNone -> TxOutDatum CtxTx era
forall ctx era. TxOutDatum ctx era
TxOutDatumNone
    TxOutDatumHash AlonzoEraOnwards era
era Hash ScriptData
h -> AlonzoEraOnwards era -> Hash ScriptData -> TxOutDatum CtxTx era
forall era ctx.
AlonzoEraOnwards era -> Hash ScriptData -> TxOutDatum ctx era
TxOutDatumHash AlonzoEraOnwards era
era Hash ScriptData
h
    TxOutDatumInline BabbageEraOnwards era
s HashableScriptData
sd -> BabbageEraOnwards era -> HashableScriptData -> TxOutDatum CtxTx era
forall era ctx.
BabbageEraOnwards era -> HashableScriptData -> TxOutDatum ctx era
TxOutDatumInline BabbageEraOnwards era
s HashableScriptData
sd

instance ToTxContext TxOut where
  toTxContext :: forall era. TxOut CtxUTxO era -> TxOut CtxTx era
toTxContext =
    (TxOutDatum CtxUTxO era -> TxOutDatum CtxTx era)
-> TxOut CtxUTxO era -> TxOut CtxTx era
forall ctx0 era ctx1.
(TxOutDatum ctx0 era -> TxOutDatum ctx1 era)
-> TxOut ctx0 era -> TxOut ctx1 era
modifyTxOutDatum TxOutDatum CtxUTxO era -> TxOutDatum CtxTx era
forall era. TxOutDatum CtxUTxO era -> TxOutDatum CtxTx era
forall {k} (f :: * -> k -> *) (era :: k).
ToTxContext f =>
f CtxUTxO era -> f CtxTx era
toTxContext