module Cooked.Skeleton.Datum
( TxSkelOutDatumConstrs,
TxSkelOutDatum (..),
txSkelOutTypedDatum,
txSkelOutUntypedDatum,
)
where
import Cooked.Conversion
import Cooked.Pretty.Class
import Data.Typeable (cast)
import Plutus.Script.Utils.Scripts qualified as Script
import PlutusLedgerApi.V3 qualified as Api
import PlutusTx.Prelude qualified as PlutusTx
import Type.Reflection
type TxSkelOutDatumConstrs a = (Show a, PrettyCooked a, Api.ToData a, PlutusTx.Eq a, Typeable a)
data TxSkelOutDatum where
TxSkelOutNoDatum :: TxSkelOutDatum
TxSkelOutDatumHash :: (TxSkelOutDatumConstrs a) => a -> TxSkelOutDatum
TxSkelOutDatum :: (TxSkelOutDatumConstrs a) => a -> TxSkelOutDatum
TxSkelOutInlineDatum :: (TxSkelOutDatumConstrs a) => a -> TxSkelOutDatum
deriving instance Show TxSkelOutDatum
instance Eq TxSkelOutDatum where
TxSkelOutDatum
x == :: TxSkelOutDatum -> TxSkelOutDatum -> Bool
== TxSkelOutDatum
y = TxSkelOutDatum -> TxSkelOutDatum -> Ordering
forall a. Ord a => a -> a -> Ordering
compare TxSkelOutDatum
x TxSkelOutDatum
y Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
EQ
instance Ord TxSkelOutDatum where
compare :: TxSkelOutDatum -> TxSkelOutDatum -> Ordering
compare = ((TxSkelOutDatum, TxSkelOutDatum) -> Ordering)
-> TxSkelOutDatum -> TxSkelOutDatum -> Ordering
forall a b c. ((a, b) -> c) -> a -> b -> c
curry (((TxSkelOutDatum, TxSkelOutDatum) -> Ordering)
-> TxSkelOutDatum -> TxSkelOutDatum -> Ordering)
-> ((TxSkelOutDatum, TxSkelOutDatum) -> Ordering)
-> TxSkelOutDatum
-> TxSkelOutDatum
-> Ordering
forall a b. (a -> b) -> a -> b
$ \case
(TxSkelOutDatum
TxSkelOutNoDatum, TxSkelOutDatum
TxSkelOutNoDatum) -> Ordering
EQ
(TxSkelOutDatumHash a
d1, TxSkelOutDatumHash a
d2) -> a -> a -> Ordering
forall {a} {a}.
(Typeable a, Typeable a, ToData a, ToData a) =>
a -> a -> Ordering
compareDats a
d1 a
d2
(TxSkelOutDatum a
d1, TxSkelOutDatum a
d2) -> a -> a -> Ordering
forall {a} {a}.
(Typeable a, Typeable a, ToData a, ToData a) =>
a -> a -> Ordering
compareDats a
d1 a
d2
(TxSkelOutInlineDatum a
d1, TxSkelOutInlineDatum a
d2) -> a -> a -> Ordering
forall {a} {a}.
(Typeable a, Typeable a, ToData a, ToData a) =>
a -> a -> Ordering
compareDats a
d1 a
d2
(TxSkelOutDatumHash {}, TxSkelOutDatum
TxSkelOutNoDatum) -> Ordering
GT
(TxSkelOutDatum {}, TxSkelOutDatum
TxSkelOutNoDatum) -> Ordering
GT
(TxSkelOutDatum {}, TxSkelOutDatumHash {}) -> Ordering
GT
(TxSkelOutInlineDatum {}, TxSkelOutDatum
_) -> Ordering
GT
(TxSkelOutDatum
_, TxSkelOutDatum
_) -> Ordering
LT
where
compareDats :: a -> a -> Ordering
compareDats a
d1 a
d2 = case SomeTypeRep -> SomeTypeRep -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (TypeRep a -> SomeTypeRep
forall k (a :: k). TypeRep a -> SomeTypeRep
SomeTypeRep (a -> TypeRep a
forall a. Typeable a => a -> TypeRep a
typeOf a
d1)) (TypeRep a -> SomeTypeRep
forall k (a :: k). TypeRep a -> SomeTypeRep
SomeTypeRep (a -> TypeRep a
forall a. Typeable a => a -> TypeRep a
typeOf a
d2)) of
Ordering
EQ -> BuiltinData -> BuiltinData -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData a
d1) (a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData a
d2)
Ordering
a -> Ordering
a
instance ToOutputDatum TxSkelOutDatum where
toOutputDatum :: TxSkelOutDatum -> OutputDatum
toOutputDatum TxSkelOutDatum
TxSkelOutNoDatum = OutputDatum
Api.NoOutputDatum
toOutputDatum (TxSkelOutDatumHash a
datum) = DatumHash -> OutputDatum
Api.OutputDatumHash (DatumHash -> OutputDatum) -> (a -> DatumHash) -> a -> OutputDatum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Datum -> DatumHash
Script.datumHash (Datum -> DatumHash) -> (a -> Datum) -> a -> DatumHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> Datum
Api.Datum (BuiltinData -> Datum) -> (a -> BuiltinData) -> a -> Datum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData (a -> OutputDatum) -> a -> OutputDatum
forall a b. (a -> b) -> a -> b
$ a
datum
toOutputDatum (TxSkelOutDatum a
datum) = DatumHash -> OutputDatum
Api.OutputDatumHash (DatumHash -> OutputDatum) -> (a -> DatumHash) -> a -> OutputDatum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Datum -> DatumHash
Script.datumHash (Datum -> DatumHash) -> (a -> Datum) -> a -> DatumHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> Datum
Api.Datum (BuiltinData -> Datum) -> (a -> BuiltinData) -> a -> Datum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData (a -> OutputDatum) -> a -> OutputDatum
forall a b. (a -> b) -> a -> b
$ a
datum
toOutputDatum (TxSkelOutInlineDatum a
datum) = Datum -> OutputDatum
Api.OutputDatum (Datum -> OutputDatum) -> (a -> Datum) -> a -> OutputDatum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> Datum
Api.Datum (BuiltinData -> Datum) -> (a -> BuiltinData) -> a -> Datum
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData (a -> OutputDatum) -> a -> OutputDatum
forall a b. (a -> b) -> a -> b
$ a
datum
txSkelOutUntypedDatum :: TxSkelOutDatum -> Maybe Api.Datum
txSkelOutUntypedDatum :: TxSkelOutDatum -> Maybe Datum
txSkelOutUntypedDatum = \case
TxSkelOutDatum
TxSkelOutNoDatum -> Maybe Datum
forall a. Maybe a
Nothing
TxSkelOutDatumHash a
x -> Datum -> Maybe Datum
forall a. a -> Maybe a
Just (BuiltinData -> Datum
Api.Datum (BuiltinData -> Datum) -> BuiltinData -> Datum
forall a b. (a -> b) -> a -> b
$ a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData a
x)
TxSkelOutDatum a
x -> Datum -> Maybe Datum
forall a. a -> Maybe a
Just (BuiltinData -> Datum
Api.Datum (BuiltinData -> Datum) -> BuiltinData -> Datum
forall a b. (a -> b) -> a -> b
$ a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData a
x)
TxSkelOutInlineDatum a
x -> Datum -> Maybe Datum
forall a. a -> Maybe a
Just (BuiltinData -> Datum
Api.Datum (BuiltinData -> Datum) -> BuiltinData -> Datum
forall a b. (a -> b) -> a -> b
$ a -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData a
x)
txSkelOutTypedDatum :: (Typeable a) => TxSkelOutDatum -> Maybe a
txSkelOutTypedDatum :: forall a. Typeable a => TxSkelOutDatum -> Maybe a
txSkelOutTypedDatum = \case
TxSkelOutDatum
TxSkelOutNoDatum -> Maybe a
forall a. Maybe a
Nothing
TxSkelOutDatumHash a
x -> a -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
x
TxSkelOutDatum a
x -> a -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
x
TxSkelOutInlineDatum a
x -> a -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
x