{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}

module PlutusLedgerApi.V4.Internal (ListEncoded (..)) where

import PlutusTx.Blueprint.Class (HasBlueprintSchema (..))
import PlutusTx.Blueprint.Schema (ConstructorSchema (..), Schema (..))
import PlutusTx.Builtins qualified as Builtins (matchData')
import PlutusTx.Builtins.Internal qualified as Builtins
import PlutusTx.IsData.Class (FromData (..), ToData (..), UnsafeFromData (..))
import PlutusTx.Prelude qualified as PlutusTx

newtype ListEncoded wrapped = ListEncoded wrapped

instance ToData wrapped => ToData (ListEncoded wrapped) where
  {-# INLINEABLE toBuiltinData #-}
  toBuiltinData :: ListEncoded wrapped -> BuiltinData
toBuiltinData (ListEncoded wrapped
value) =
    BuiltinList BuiltinData -> BuiltinData
Builtins.mkList (BuiltinPair BuiltinInteger (BuiltinList BuiltinData)
-> BuiltinList BuiltinData
forall a b. BuiltinPair a b -> b
Builtins.snd (BuiltinData -> BuiltinPair BuiltinInteger (BuiltinList BuiltinData)
Builtins.unsafeDataAsConstr (wrapped -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData wrapped
value)))

instance FromData wrapped => FromData (ListEncoded wrapped) where
  {-# INLINEABLE fromBuiltinData #-}
  fromBuiltinData :: BuiltinData -> Maybe (ListEncoded wrapped)
fromBuiltinData BuiltinData
value =
    BuiltinData
-> (BuiltinInteger
    -> BuiltinList BuiltinData -> Maybe (ListEncoded wrapped))
-> (BuiltinList (BuiltinPair BuiltinData BuiltinData)
    -> Maybe (ListEncoded wrapped))
-> (BuiltinList BuiltinData -> Maybe (ListEncoded wrapped))
-> (BuiltinInteger -> Maybe (ListEncoded wrapped))
-> (BuiltinByteString -> Maybe (ListEncoded wrapped))
-> Maybe (ListEncoded wrapped)
forall r.
BuiltinData
-> (BuiltinInteger -> BuiltinList BuiltinData -> r)
-> (BuiltinList (BuiltinPair BuiltinData BuiltinData) -> r)
-> (BuiltinList BuiltinData -> r)
-> (BuiltinInteger -> r)
-> (BuiltinByteString -> r)
-> r
Builtins.matchData'
      BuiltinData
value
      (\BuiltinInteger
_ BuiltinList BuiltinData
_ -> Maybe (ListEncoded wrapped)
forall a. Maybe a
Nothing)
      (\BuiltinList (BuiltinPair BuiltinData BuiltinData)
_ -> Maybe (ListEncoded wrapped)
forall a. Maybe a
Nothing)
      (\BuiltinList BuiltinData
fields -> wrapped -> ListEncoded wrapped
forall wrapped. wrapped -> ListEncoded wrapped
ListEncoded (wrapped -> ListEncoded wrapped)
-> Maybe wrapped -> Maybe (ListEncoded wrapped)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
PlutusTx.<$> BuiltinData -> Maybe wrapped
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (BuiltinInteger -> BuiltinList BuiltinData -> BuiltinData
Builtins.mkConstr BuiltinInteger
0 BuiltinList BuiltinData
fields))
      (\BuiltinInteger
_ -> Maybe (ListEncoded wrapped)
forall a. Maybe a
Nothing)
      (\BuiltinByteString
_ -> Maybe (ListEncoded wrapped)
forall a. Maybe a
Nothing)

instance UnsafeFromData wrapped => UnsafeFromData (ListEncoded wrapped) where
  {-# INLINEABLE unsafeFromBuiltinData #-}
  unsafeFromBuiltinData :: BuiltinData -> ListEncoded wrapped
unsafeFromBuiltinData BuiltinData
value =
    wrapped -> ListEncoded wrapped
forall wrapped. wrapped -> ListEncoded wrapped
ListEncoded (BuiltinData -> wrapped
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (BuiltinInteger -> BuiltinList BuiltinData -> BuiltinData
Builtins.mkConstr BuiltinInteger
0 (BuiltinData -> BuiltinList BuiltinData
Builtins.unsafeDataAsList BuiltinData
value)))

instance
  HasBlueprintSchema wrapped referencedTypes
  => HasBlueprintSchema (ListEncoded wrapped) referencedTypes
  where
  schema :: Schema referencedTypes
schema = case forall wrapped (referencedTypes :: [*]).
HasBlueprintSchema wrapped referencedTypes =>
Schema referencedTypes
schema @wrapped @referencedTypes of
    SchemaConstructor SchemaInfo
info (MkConstructorSchema Natural
0 [Schema referencedTypes]
fields) -> SchemaInfo -> [Schema referencedTypes] -> Schema referencedTypes
forall (referencedTypes :: [*]).
SchemaInfo -> [Schema referencedTypes] -> Schema referencedTypes
SchemaListTuple SchemaInfo
info [Schema referencedTypes]
fields
    Schema referencedTypes
_ -> [Char] -> Schema referencedTypes
forall a. HasCallStack => [Char] -> a
error [Char]
"ListEncoded requires a product schema with constructor index zero"