module Plutarch.LedgerApi.Value.AssetClass (
  PAssetClass (..),
) where

import GHC.Generics (Generic)
import Generics.SOP qualified as SOP
import Plutarch.LedgerApi.Value.CurrencySymbol (PCurrencySymbol)
import Plutarch.LedgerApi.Value.TokenName (PTokenName)
import Plutarch.Prelude
import PlutusLedgerApi.V1.Value qualified as PlutusValue

-- | @since 3.3.0
newtype PAssetClass (s :: S) = PAssetClass (Term s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName)))
  deriving stock
    ( -- | @since 3.3.0
      (forall x. PAssetClass s -> Rep (PAssetClass s) x)
-> (forall x. Rep (PAssetClass s) x -> PAssetClass s)
-> Generic (PAssetClass s)
forall x. Rep (PAssetClass s) x -> PAssetClass s
forall x. PAssetClass s -> Rep (PAssetClass s) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (s :: S) x. Rep (PAssetClass s) x -> PAssetClass s
forall (s :: S) x. PAssetClass s -> Rep (PAssetClass s) x
$cfrom :: forall (s :: S) x. PAssetClass s -> Rep (PAssetClass s) x
from :: forall x. PAssetClass s -> Rep (PAssetClass s) x
$cto :: forall (s :: S) x. Rep (PAssetClass s) x -> PAssetClass s
to :: forall x. Rep (PAssetClass s) x -> PAssetClass s
Generic
    )
  deriving anyclass
    ( -- | @since 3.3.0
      All SListI (Code (PAssetClass s))
All SListI (Code (PAssetClass s)) =>
(PAssetClass s -> Rep (PAssetClass s))
-> (Rep (PAssetClass s) -> PAssetClass s)
-> Generic (PAssetClass s)
Rep (PAssetClass s) -> PAssetClass s
PAssetClass s -> Rep (PAssetClass s)
forall a.
All SListI (Code a) =>
(a -> Rep a) -> (Rep a -> a) -> Generic a
forall (s :: S). All SListI (Code (PAssetClass s))
forall (s :: S). Rep (PAssetClass s) -> PAssetClass s
forall (s :: S). PAssetClass s -> Rep (PAssetClass s)
$cfrom :: forall (s :: S). PAssetClass s -> Rep (PAssetClass s)
from :: PAssetClass s -> Rep (PAssetClass s)
$cto :: forall (s :: S). Rep (PAssetClass s) -> PAssetClass s
to :: Rep (PAssetClass s) -> PAssetClass s
SOP.Generic
    , -- | @since 3.3.0
      (forall (s :: S).
 Term s (PAsData PAssetClass) -> Term s PAssetClass)
-> (forall (s :: S). Term s PAssetClass -> Term s PData)
-> PIsData PAssetClass
forall (s :: S). Term s (PAsData PAssetClass) -> Term s PAssetClass
forall (s :: S). Term s PAssetClass -> Term s PData
forall (a :: S -> Type).
(forall (s :: S). Term s (PAsData a) -> Term s a)
-> (forall (s :: S). Term s a -> Term s PData) -> PIsData a
$cpfromDataImpl :: forall (s :: S). Term s (PAsData PAssetClass) -> Term s PAssetClass
pfromDataImpl :: forall (s :: S). Term s (PAsData PAssetClass) -> Term s PAssetClass
$cpdataImpl :: forall (s :: S). Term s PAssetClass -> Term s PData
pdataImpl :: forall (s :: S). Term s PAssetClass -> Term s PData
PIsData
    , -- | @since 3.3.0
      (forall (s :: S).
 Term s PAssetClass -> Term s PAssetClass -> Term s PBool)
-> PEq PAssetClass
forall (s :: S).
Term s PAssetClass -> Term s PAssetClass -> Term s PBool
forall (t :: S -> Type).
(forall (s :: S). Term s t -> Term s t -> Term s PBool) -> PEq t
$c#== :: forall (s :: S).
Term s PAssetClass -> Term s PAssetClass -> Term s PBool
#== :: forall (s :: S).
Term s PAssetClass -> Term s PAssetClass -> Term s PBool
PEq
    , -- | @since 3.3.0
      (forall (s :: S). Bool -> Term s PAssetClass -> Term s PString)
-> PShow PAssetClass
forall (s :: S). Bool -> Term s PAssetClass -> Term s PString
forall (t :: S -> Type).
(forall (s :: S). Bool -> Term s t -> Term s PString) -> PShow t
$cpshow' :: forall (s :: S). Bool -> Term s PAssetClass -> Term s PString
pshow' :: forall (s :: S). Bool -> Term s PAssetClass -> Term s PString
PShow
    )
  deriving
    ( -- | @since 3.3.0
      (forall (s :: S). PAssetClass s -> Term s (PInner PAssetClass))
-> (forall (s :: S) (b :: S -> Type).
    Term s (PInner PAssetClass)
    -> (PAssetClass s -> Term s b) -> Term s b)
-> PlutusType PAssetClass
forall (s :: S). PAssetClass s -> Term s (PInner PAssetClass)
forall (s :: S) (b :: S -> Type).
Term s (PInner PAssetClass)
-> (PAssetClass s -> Term s b) -> Term s b
forall (a :: S -> Type).
(forall (s :: S). a s -> Term s (PInner a))
-> (forall (s :: S) (b :: S -> Type).
    Term s (PInner a) -> (a s -> Term s b) -> Term s b)
-> PlutusType a
$cpcon' :: forall (s :: S). PAssetClass s -> Term s (PInner PAssetClass)
pcon' :: forall (s :: S). PAssetClass s -> Term s (PInner PAssetClass)
$cpmatch' :: forall (s :: S) (b :: S -> Type).
Term s (PInner PAssetClass)
-> (PAssetClass s -> Term s b) -> Term s b
pmatch' :: forall (s :: S) (b :: S -> Type).
Term s (PInner PAssetClass)
-> (PAssetClass s -> Term s b) -> Term s b
PlutusType
    )
    via (DeriveNewtypePlutusType PAssetClass)
  deriving
    ( -- | @since 3.6.0
      (forall (s :: S).
 Term s PData -> forall (r :: S -> Type). Term s r -> Term s r)
-> PValidateData PAssetClass
forall (s :: S).
Term s PData -> forall (r :: S -> Type). Term s r -> Term s r
forall (a :: S -> Type).
(forall (s :: S).
 Term s PData -> forall (r :: S -> Type). Term s r -> Term s r)
-> PValidateData a
$cpwithValidated :: forall (s :: S).
Term s PData -> forall (r :: S -> Type). Term s r -> Term s r
pwithValidated :: forall (s :: S).
Term s PData -> forall (r :: S -> Type). Term s r -> Term s r
PValidateData
    )
    via ( DeriveNewtypePValidateData
            PAssetClass
            (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
        )

-- | @since 3.3.0
instance POrd PAssetClass where
  {-# INLINEABLE (#<=) #-}
  Term s PAssetClass
ac1 #<= :: forall (s :: S).
Term s PAssetClass -> Term s PAssetClass -> Term s PBool
#<= Term s PAssetClass
ac2 = Term s PAssetClass
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term s PAssetClass
ac1 ((PAssetClass s -> Term s PBool) -> Term s PBool)
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PAssetClass Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair1) ->
    Term s PAssetClass
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term s PAssetClass
ac2 ((PAssetClass s -> Term s PBool) -> Term s PBool)
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PAssetClass Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair2) ->
      Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair1 ((PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
  -> Term s PBool)
 -> Term s PBool)
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PBuiltinPair Term s (PAsData PCurrencySymbol)
fst1' Term s (PAsData PTokenName)
snd1') ->
        Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair2 ((PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
  -> Term s PBool)
 -> Term s PBool)
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PBuiltinPair Term s (PAsData PCurrencySymbol)
fst2' Term s (PAsData PTokenName)
snd2') ->
          Term s PCurrencySymbol
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall (s :: S) (a :: S -> Type) (b :: S -> Type).
Term s a -> (Term s a -> Term s b) -> Term s b
plet (Term s (PAsData PCurrencySymbol) -> Term s PCurrencySymbol
forall (a :: S -> Type) (s :: S).
PIsData a =>
Term s (PAsData a) -> Term s a
pfromData Term s (PAsData PCurrencySymbol)
fst1') ((Term s PCurrencySymbol -> Term s PBool) -> Term s PBool)
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \Term s PCurrencySymbol
fst1 ->
            Term s PCurrencySymbol
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall (s :: S) (a :: S -> Type) (b :: S -> Type).
Term s a -> (Term s a -> Term s b) -> Term s b
plet (Term s (PAsData PCurrencySymbol) -> Term s PCurrencySymbol
forall (a :: S -> Type) (s :: S).
PIsData a =>
Term s (PAsData a) -> Term s a
pfromData Term s (PAsData PCurrencySymbol)
fst2') ((Term s PCurrencySymbol -> Term s PBool) -> Term s PBool)
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \Term s PCurrencySymbol
fst2 ->
              (Term s PCurrencySymbol
fst1 Term s PCurrencySymbol -> Term s PCurrencySymbol -> Term s PBool
forall (s :: S).
Term s PCurrencySymbol -> Term s PCurrencySymbol -> Term s PBool
forall (t :: S -> Type) (s :: S).
POrd t =>
Term s t -> Term s t -> Term s PBool
#< Term s PCurrencySymbol
fst2)
                #|| ( (fst1 #== fst2)
                        #&& ( let snd1 = pfromData snd1'
                                  snd2 = pfromData snd2'
                               in snd1 #<= snd2
                            )
                    )
  {-# INLINEABLE (#<) #-}
  Term s PAssetClass
ac1 #< :: forall (s :: S).
Term s PAssetClass -> Term s PAssetClass -> Term s PBool
#< Term s PAssetClass
ac2 = Term s PAssetClass
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term s PAssetClass
ac1 ((PAssetClass s -> Term s PBool) -> Term s PBool)
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PAssetClass Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair1) ->
    Term s PAssetClass
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term s PAssetClass
ac2 ((PAssetClass s -> Term s PBool) -> Term s PBool)
-> (PAssetClass s -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PAssetClass Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair2) ->
      Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair1 ((PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
  -> Term s PBool)
 -> Term s PBool)
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PBuiltinPair Term s (PAsData PCurrencySymbol)
fst1' Term s (PAsData PTokenName)
snd1') ->
        Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall (a :: S -> Type) (s :: S) (b :: S -> Type).
PlutusType a =>
Term s a -> (a s -> Term s b) -> Term s b
pmatch Term
  s (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName))
pair2 ((PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
  -> Term s PBool)
 -> Term s PBool)
-> (PBuiltinPair (PAsData PCurrencySymbol) (PAsData PTokenName) s
    -> Term s PBool)
-> Term s PBool
forall a b. (a -> b) -> a -> b
$ \(PBuiltinPair Term s (PAsData PCurrencySymbol)
fst2' Term s (PAsData PTokenName)
snd2') ->
          Term s PCurrencySymbol
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall (s :: S) (a :: S -> Type) (b :: S -> Type).
Term s a -> (Term s a -> Term s b) -> Term s b
plet (Term s (PAsData PCurrencySymbol) -> Term s PCurrencySymbol
forall (a :: S -> Type) (s :: S).
PIsData a =>
Term s (PAsData a) -> Term s a
pfromData Term s (PAsData PCurrencySymbol)
fst1') ((Term s PCurrencySymbol -> Term s PBool) -> Term s PBool)
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \Term s PCurrencySymbol
fst1 ->
            Term s PCurrencySymbol
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall (s :: S) (a :: S -> Type) (b :: S -> Type).
Term s a -> (Term s a -> Term s b) -> Term s b
plet (Term s (PAsData PCurrencySymbol) -> Term s PCurrencySymbol
forall (a :: S -> Type) (s :: S).
PIsData a =>
Term s (PAsData a) -> Term s a
pfromData Term s (PAsData PCurrencySymbol)
fst2') ((Term s PCurrencySymbol -> Term s PBool) -> Term s PBool)
-> (Term s PCurrencySymbol -> Term s PBool) -> Term s PBool
forall a b. (a -> b) -> a -> b
$ \Term s PCurrencySymbol
fst2 ->
              (Term s PCurrencySymbol
fst1 Term s PCurrencySymbol -> Term s PCurrencySymbol -> Term s PBool
forall (s :: S).
Term s PCurrencySymbol -> Term s PCurrencySymbol -> Term s PBool
forall (t :: S -> Type) (s :: S).
POrd t =>
Term s t -> Term s t -> Term s PBool
#< Term s PCurrencySymbol
fst2)
                #|| ( (fst1 #== fst2)
                        #&& ( let snd1 = pfromData snd1'
                                  snd2 = pfromData snd2'
                               in snd1 #< snd2
                            )
                    )

-- | @since 3.3.0
deriving via
  DeriveNewtypePLiftable PAssetClass PlutusValue.AssetClass
  instance
    PLiftable PAssetClass

-- | @since 3.4.0
instance PTryFrom PData (PAsData PAssetClass)