module Cooked.Skeleton.Redeemer
  ( TxSkelRedeemer (..),
    RedeemerConstrs,
    withReferenceInput,
    someTxSkelRedeemer,
    emptyTxSkelRedeemer,
    txSkelRedeemerReferenceInputL,
    txSkelRedeemerAutoFillL,
    txSkelRedeemerTypedAT,
    someTxSkelRedeemerNoAutoFill,
    emptyTxSkelRedeemerNoAutoFill,
    txSkelRedeemerBuiltinDataL,
  )
where
import Cooked.Pretty.Class
import Cooked.Pretty.Plutus ()
import Data.Typeable (Typeable, cast)
import Optics.Core
import Optics.TH
import PlutusLedgerApi.V3 qualified as Api
import PlutusTx.Prelude qualified as PlutusTx
type RedeemerConstrs redeemer =
  ( Api.ToData redeemer,
    Api.FromData redeemer,
    Show redeemer,
    PrettyCooked redeemer,
    PlutusTx.Eq redeemer,
    Typeable redeemer
  )
data TxSkelRedeemer where
  TxSkelRedeemer ::
    (RedeemerConstrs redeemer) =>
    { 
      ()
txSkelRedeemerContent :: redeemer,
      
      
      
      TxSkelRedeemer -> Maybe TxOutRef
txSkelRedeemerReferenceInput :: Maybe Api.TxOutRef,
      
      
      TxSkelRedeemer -> Bool
txSkelRedeemerAutoFill :: Bool
    } ->
    TxSkelRedeemer
deriving instance (Show TxSkelRedeemer)
instance Eq TxSkelRedeemer where
  (TxSkelRedeemer redeemer
red Maybe TxOutRef
mRefIn Bool
af) == :: TxSkelRedeemer -> TxSkelRedeemer -> Bool
== TxSkelRedeemer redeemer
red' Maybe TxOutRef
mRefIn' Bool
af' =
    redeemer -> Maybe redeemer
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast redeemer
red Maybe redeemer -> Maybe redeemer -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== redeemer -> Maybe redeemer
forall a. a -> Maybe a
Just redeemer
red' Bool -> Bool -> Bool
PlutusTx.&& Maybe TxOutRef
mRefIn Maybe TxOutRef -> Maybe TxOutRef -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== Maybe TxOutRef
mRefIn' Bool -> Bool -> Bool
PlutusTx.&& Bool
af Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== Bool
af'
makeLensesFor [("txSkelRedeemerReferenceInput", "txSkelRedeemerReferenceInputL")] ''TxSkelRedeemer
makeLensesFor [("txSkelRedeemerAutoFill", "txSkelRedeemerAutoFillL")] ''TxSkelRedeemer
withReferenceInput :: TxSkelRedeemer -> Api.TxOutRef -> TxSkelRedeemer
withReferenceInput :: TxSkelRedeemer -> TxOutRef -> TxSkelRedeemer
withReferenceInput TxSkelRedeemer
red TxOutRef
ref = TxSkelRedeemer
red TxSkelRedeemer
-> (TxSkelRedeemer -> TxSkelRedeemer) -> TxSkelRedeemer
forall a b. a -> (a -> b) -> b
& Lens' TxSkelRedeemer (Maybe TxOutRef)
txSkelRedeemerReferenceInputL Lens' TxSkelRedeemer (Maybe TxOutRef)
-> TxOutRef -> TxSkelRedeemer -> TxSkelRedeemer
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a (Maybe b) -> b -> s -> t
?~ TxOutRef
ref
txSkelRedeemerTypedAT :: (RedeemerConstrs a, RedeemerConstrs b) => AffineTraversal TxSkelRedeemer TxSkelRedeemer a b
txSkelRedeemerTypedAT :: forall a b.
(RedeemerConstrs a, RedeemerConstrs b) =>
AffineTraversal TxSkelRedeemer TxSkelRedeemer a b
txSkelRedeemerTypedAT =
  (TxSkelRedeemer -> Either TxSkelRedeemer a)
-> (TxSkelRedeemer -> b -> TxSkelRedeemer)
-> AffineTraversal TxSkelRedeemer TxSkelRedeemer a b
forall s t a b.
(s -> Either t a) -> (s -> b -> t) -> AffineTraversal s t a b
atraversal
    ( \case
        (TxSkelRedeemer redeemer
content Maybe TxOutRef
_ Bool
_) | Just a
content' <- redeemer -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast redeemer
content -> a -> Either TxSkelRedeemer a
forall a b. b -> Either a b
Right a
content'
        (TxSkelRedeemer redeemer
content Maybe TxOutRef
_ Bool
_) | Just a
content' <- BuiltinData -> Maybe a
forall a. FromData a => BuiltinData -> Maybe a
Api.fromBuiltinData (BuiltinData -> Maybe a) -> BuiltinData -> Maybe a
forall a b. (a -> b) -> a -> b
$ redeemer -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData redeemer
content -> a -> Either TxSkelRedeemer a
forall a b. b -> Either a b
Right a
content'
        TxSkelRedeemer
txSkelRed -> TxSkelRedeemer -> Either TxSkelRedeemer a
forall a b. a -> Either a b
Left TxSkelRedeemer
txSkelRed
    )
    (\TxSkelRedeemer
red b
content -> TxSkelRedeemer
red {txSkelRedeemerContent = content})
txSkelRedeemerBuiltinDataL :: Lens' TxSkelRedeemer Api.BuiltinData
txSkelRedeemerBuiltinDataL :: Lens' TxSkelRedeemer BuiltinData
txSkelRedeemerBuiltinDataL =
  (TxSkelRedeemer -> BuiltinData)
-> (TxSkelRedeemer -> BuiltinData -> TxSkelRedeemer)
-> Lens' TxSkelRedeemer BuiltinData
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens
    (\(TxSkelRedeemer redeemer
content Maybe TxOutRef
_ Bool
_) -> redeemer -> BuiltinData
forall a. ToData a => a -> BuiltinData
Api.toBuiltinData redeemer
content)
    (\TxSkelRedeemer
txSkelRed BuiltinData
bData -> TxSkelRedeemer
txSkelRed {txSkelRedeemerContent = bData})
someTxSkelRedeemer :: (RedeemerConstrs redeemer) => redeemer -> TxSkelRedeemer
someTxSkelRedeemer :: forall redeemer.
RedeemerConstrs redeemer =>
redeemer -> TxSkelRedeemer
someTxSkelRedeemer redeemer
red = redeemer -> Maybe TxOutRef -> Bool -> TxSkelRedeemer
forall redeemer.
RedeemerConstrs redeemer =>
redeemer -> Maybe TxOutRef -> Bool -> TxSkelRedeemer
TxSkelRedeemer redeemer
red Maybe TxOutRef
forall a. Maybe a
Nothing Bool
True
someTxSkelRedeemerNoAutoFill :: (RedeemerConstrs redeemer) => redeemer -> TxSkelRedeemer
someTxSkelRedeemerNoAutoFill :: forall redeemer.
RedeemerConstrs redeemer =>
redeemer -> TxSkelRedeemer
someTxSkelRedeemerNoAutoFill redeemer
red = redeemer -> Maybe TxOutRef -> Bool -> TxSkelRedeemer
forall redeemer.
RedeemerConstrs redeemer =>
redeemer -> Maybe TxOutRef -> Bool -> TxSkelRedeemer
TxSkelRedeemer redeemer
red Maybe TxOutRef
forall a. Maybe a
Nothing Bool
False
emptyTxSkelRedeemer :: TxSkelRedeemer
emptyTxSkelRedeemer :: TxSkelRedeemer
emptyTxSkelRedeemer = () -> TxSkelRedeemer
forall redeemer.
RedeemerConstrs redeemer =>
redeemer -> TxSkelRedeemer
someTxSkelRedeemer ()
emptyTxSkelRedeemerNoAutoFill :: TxSkelRedeemer
emptyTxSkelRedeemerNoAutoFill :: TxSkelRedeemer
emptyTxSkelRedeemerNoAutoFill = () -> TxSkelRedeemer
forall redeemer.
RedeemerConstrs redeemer =>
redeemer -> TxSkelRedeemer
someTxSkelRedeemerNoAutoFill ()