{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
module PlutusCore.Builtin.Case where
import PlutusCore.Core.Type (Type, UniOf)
import PlutusCore.Name.Unique
import Control.DeepSeq (NFData (..), rwhnf)
import Data.Default.Class (Default (..))
import Data.Text (Text)
import Data.Vector (Vector)
import NoThunks.Class
import Text.PrettyBy (display)
import Universe
class AnnotateCaseBuiltin uni where
annotateCaseBuiltin
:: UniOf term ~ uni
=> SomeTypeIn uni
-> [term]
-> Either Text [(term, [Type TyName uni ann])]
class CaseBuiltin uni where
caseBuiltin :: UniOf term ~ uni => Some (ValueOf uni) -> Vector term -> Either Text term
data CaserBuiltin uni = CaserBuiltin
{ forall (uni :: * -> *).
CaserBuiltin uni
-> forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term
unCaserBuiltin
:: !(forall term. UniOf term ~ uni => Some (ValueOf uni) -> Vector term -> Either Text term)
}
instance NFData (CaserBuiltin uni) where
rnf :: CaserBuiltin uni -> ()
rnf = CaserBuiltin uni -> ()
forall a. a -> ()
rwhnf
deriving via OnlyCheckWhnfNamed "PlutusCore.Builtin.Case.CaserBuiltin" (CaserBuiltin uni)
instance NoThunks (CaserBuiltin uni)
instance CaseBuiltin uni => Default (CaserBuiltin uni) where
def :: CaserBuiltin uni
def = (forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term)
-> CaserBuiltin uni
forall (uni :: * -> *).
(forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term)
-> CaserBuiltin uni
CaserBuiltin Some (ValueOf uni) -> Vector term -> Either Text term
forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term
forall (uni :: * -> *) term.
(CaseBuiltin uni, UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term
caseBuiltin
unavailableCaserBuiltin :: Int -> CaserBuiltin uni
unavailableCaserBuiltin :: forall (uni :: * -> *). Int -> CaserBuiltin uni
unavailableCaserBuiltin Int
ver =
(forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term)
-> CaserBuiltin uni
forall (uni :: * -> *).
(forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term)
-> CaserBuiltin uni
CaserBuiltin ((forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term)
-> CaserBuiltin uni)
-> (forall term.
(UniOf term ~ uni) =>
Some (ValueOf uni) -> Vector term -> Either Text term)
-> CaserBuiltin uni
forall a b. (a -> b) -> a -> b
$ \Some (ValueOf uni)
_ Vector term
_ -> Text -> Either Text term
forall a b. a -> Either a b
Left (Text -> Either Text term) -> Text -> Either Text term
forall a b. (a -> b) -> a -> b
$
Text
"'case' on values of built-in types is not supported in protocol version " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text
forall str a. (Pretty a, Render str) => a -> str
display Int
ver