{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE StrictData #-}
module PlutusCore.Builtin.KnownType
( BuiltinError
, throwBuiltinErrorWithCause
, KnownBuiltinTypeIn
, KnownBuiltinType
, BuiltinResult (..)
, ReadKnownM
, Spine (..)
, HeadSpine (..)
, MakeKnownIn (..)
, readKnownConstant
, MakeKnown
, ReadKnownIn (..)
, ReadKnown
, makeKnownOrFail
, readKnownSelf
) where
import PlutusPrelude
import PlutusCore.Builtin.HasConstant
import PlutusCore.Builtin.Polymorphism
import PlutusCore.Builtin.Result
import PlutusCore.Core
import PlutusCore.Evaluation.ErrorWithCause
import PlutusCore.Evaluation.Result
import PlutusCore.Pretty
import Data.Either.Extras
import Data.Functor.Identity
import Data.String
import GHC.Exts (inline, oneShot)
import GHC.TypeLits
import Prettyprinter
import Text.PrettyBy.Internal
import Universe
type KnownBuiltinTypeIn uni val a =
(HasConstantIn uni val, PrettyParens (SomeTypeIn uni), GEq uni, uni `HasTermLevel` a)
type KnownBuiltinType val a = KnownBuiltinTypeIn (UniOf val) val a
typeMismatchError
:: PrettyParens (SomeTypeIn uni)
=> uni (Esc a)
-> uni (Esc b)
-> UnliftingEvaluationError
typeMismatchError :: forall (uni :: * -> *) a b.
PrettyParens (SomeTypeIn uni) =>
uni (Esc a) -> uni (Esc b) -> UnliftingEvaluationError
typeMismatchError uni (Esc a)
uniExp uni (Esc b)
uniAct =
EvaluationError UnliftingError UnliftingError
-> UnliftingEvaluationError
MkUnliftingEvaluationError (EvaluationError UnliftingError UnliftingError
-> UnliftingEvaluationError)
-> ([Char] -> EvaluationError UnliftingError UnliftingError)
-> [Char]
-> UnliftingEvaluationError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnliftingError -> EvaluationError UnliftingError UnliftingError
forall structural operational.
structural -> EvaluationError structural operational
StructuralEvaluationError (UnliftingError -> EvaluationError UnliftingError UnliftingError)
-> ([Char] -> UnliftingError)
-> [Char]
-> EvaluationError UnliftingError UnliftingError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> UnliftingError
forall a. IsString a => [Char] -> a
fromString ([Char] -> UnliftingEvaluationError)
-> [Char] -> UnliftingEvaluationError
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [Char]
"Type mismatch: "
, [Char]
"expected: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ RenderContext -> SomeTypeIn uni -> [Char]
forall str a config.
(PrettyBy config a, Render str) =>
config -> a -> str
displayBy RenderContext
botRenderContext (uni (Esc a) -> SomeTypeIn uni
forall (uni :: * -> *) k (a :: k). uni (Esc a) -> SomeTypeIn uni
SomeTypeIn uni (Esc a)
uniExp)
, [Char]
"; actual: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ RenderContext -> SomeTypeIn uni -> [Char]
forall str a config.
(PrettyBy config a, Render str) =>
config -> a -> str
displayBy RenderContext
botRenderContext (uni (Esc b) -> SomeTypeIn uni
forall (uni :: * -> *) k (a :: k). uni (Esc a) -> SomeTypeIn uni
SomeTypeIn uni (Esc b)
uniAct)
]
{-# OPAQUE typeMismatchError #-}
type ReadKnownM = Either BuiltinError
readKnownConstant :: forall val a. KnownBuiltinType val a => val -> ReadKnownM a
readKnownConstant :: forall val a. KnownBuiltinType val a => val -> ReadKnownM a
readKnownConstant val
val = val -> Either BuiltinError (Some (ValueOf (UniOf val)))
forall term.
HasConstant term =>
term -> Either BuiltinError (Some (ValueOf (UniOf term)))
asConstant val
val Either BuiltinError (Some (ValueOf (UniOf val)))
-> (Some (ValueOf (UniOf val)) -> Either BuiltinError a)
-> Either BuiltinError a
forall a b.
Either BuiltinError a
-> (a -> Either BuiltinError b) -> Either BuiltinError b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Some (ValueOf (UniOf val)) -> Either BuiltinError a)
-> Some (ValueOf (UniOf val)) -> Either BuiltinError a
forall a b. (a -> b) -> a -> b
oneShot \case
Some (ValueOf UniOf val (Esc a)
uniAct a
x) -> do
let uniExp :: UniOf val (Esc a)
uniExp = forall k (uni :: * -> *) (a :: k). Contains uni a => uni (Esc a)
knownUni @_ @(UniOf val) @a
case UniOf val (Esc a)
uniExp UniOf val (Esc a) -> UniOf val (Esc a) -> Maybe (Esc a :~: Esc a)
forall a b. UniOf val a -> UniOf val b -> Maybe (a :~: b)
forall k (f :: k -> *) (a :: k) (b :: k).
GEq f =>
f a -> f b -> Maybe (a :~: b)
`geq` UniOf val (Esc a)
uniAct of
Just Esc a :~: Esc a
Refl -> a -> Either BuiltinError a
forall a. a -> Either BuiltinError a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a
x
Maybe (Esc a :~: Esc a)
Nothing -> AReview BuiltinError UnliftingEvaluationError
-> UnliftingEvaluationError -> Either BuiltinError a
forall e (m :: * -> *) t x.
MonadError e m =>
AReview e t -> t -> m x
throwing AReview BuiltinError UnliftingEvaluationError
forall r.
AsUnliftingEvaluationError r =>
Prism' r UnliftingEvaluationError
Prism' BuiltinError UnliftingEvaluationError
_UnliftingEvaluationError (UnliftingEvaluationError -> Either BuiltinError a)
-> UnliftingEvaluationError -> Either BuiltinError a
forall a b. (a -> b) -> a -> b
$ UniOf val (Esc a) -> UniOf val (Esc a) -> UnliftingEvaluationError
forall (uni :: * -> *) a b.
PrettyParens (SomeTypeIn uni) =>
uni (Esc a) -> uni (Esc b) -> UnliftingEvaluationError
typeMismatchError UniOf val (Esc a)
uniExp UniOf val (Esc a)
uniAct
{-# INLINE readKnownConstant #-}
data Spine a
= SpineLast a
| SpineCons a (Spine a)
deriving stock (Int -> Spine a -> [Char] -> [Char]
[Spine a] -> [Char] -> [Char]
Spine a -> [Char]
(Int -> Spine a -> [Char] -> [Char])
-> (Spine a -> [Char])
-> ([Spine a] -> [Char] -> [Char])
-> Show (Spine a)
forall a. Show a => Int -> Spine a -> [Char] -> [Char]
forall a. Show a => [Spine a] -> [Char] -> [Char]
forall a. Show a => Spine a -> [Char]
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Spine a -> [Char] -> [Char]
showsPrec :: Int -> Spine a -> [Char] -> [Char]
$cshow :: forall a. Show a => Spine a -> [Char]
show :: Spine a -> [Char]
$cshowList :: forall a. Show a => [Spine a] -> [Char] -> [Char]
showList :: [Spine a] -> [Char] -> [Char]
Show, Spine a -> Spine a -> Bool
(Spine a -> Spine a -> Bool)
-> (Spine a -> Spine a -> Bool) -> Eq (Spine a)
forall a. Eq a => Spine a -> Spine a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Spine a -> Spine a -> Bool
== :: Spine a -> Spine a -> Bool
$c/= :: forall a. Eq a => Spine a -> Spine a -> Bool
/= :: Spine a -> Spine a -> Bool
Eq, (forall m. Monoid m => Spine m -> m)
-> (forall m a. Monoid m => (a -> m) -> Spine a -> m)
-> (forall m a. Monoid m => (a -> m) -> Spine a -> m)
-> (forall a b. (a -> b -> b) -> b -> Spine a -> b)
-> (forall a b. (a -> b -> b) -> b -> Spine a -> b)
-> (forall b a. (b -> a -> b) -> b -> Spine a -> b)
-> (forall b a. (b -> a -> b) -> b -> Spine a -> b)
-> (forall a. (a -> a -> a) -> Spine a -> a)
-> (forall a. (a -> a -> a) -> Spine a -> a)
-> (forall a. Spine a -> [a])
-> (forall a. Spine a -> Bool)
-> (forall a. Spine a -> Int)
-> (forall a. Eq a => a -> Spine a -> Bool)
-> (forall a. Ord a => Spine a -> a)
-> (forall a. Ord a => Spine a -> a)
-> (forall a. Num a => Spine a -> a)
-> (forall a. Num a => Spine a -> a)
-> Foldable Spine
forall a. Eq a => a -> Spine a -> Bool
forall a. Num a => Spine a -> a
forall a. Ord a => Spine a -> a
forall m. Monoid m => Spine m -> m
forall a. Spine a -> Bool
forall a. Spine a -> Int
forall a. Spine a -> [a]
forall a. (a -> a -> a) -> Spine a -> a
forall m a. Monoid m => (a -> m) -> Spine a -> m
forall b a. (b -> a -> b) -> b -> Spine a -> b
forall a b. (a -> b -> b) -> b -> Spine a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => Spine m -> m
fold :: forall m. Monoid m => Spine m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Spine a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Spine a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Spine a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Spine a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> Spine a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Spine a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Spine a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Spine a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Spine a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Spine a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Spine a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Spine a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> Spine a -> a
foldr1 :: forall a. (a -> a -> a) -> Spine a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Spine a -> a
foldl1 :: forall a. (a -> a -> a) -> Spine a -> a
$ctoList :: forall a. Spine a -> [a]
toList :: forall a. Spine a -> [a]
$cnull :: forall a. Spine a -> Bool
null :: forall a. Spine a -> Bool
$clength :: forall a. Spine a -> Int
length :: forall a. Spine a -> Int
$celem :: forall a. Eq a => a -> Spine a -> Bool
elem :: forall a. Eq a => a -> Spine a -> Bool
$cmaximum :: forall a. Ord a => Spine a -> a
maximum :: forall a. Ord a => Spine a -> a
$cminimum :: forall a. Ord a => Spine a -> a
minimum :: forall a. Ord a => Spine a -> a
$csum :: forall a. Num a => Spine a -> a
sum :: forall a. Num a => Spine a -> a
$cproduct :: forall a. Num a => Spine a -> a
product :: forall a. Num a => Spine a -> a
Foldable, (forall a b. (a -> b) -> Spine a -> Spine b)
-> (forall a b. a -> Spine b -> Spine a) -> Functor Spine
forall a b. a -> Spine b -> Spine a
forall a b. (a -> b) -> Spine a -> Spine b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Spine a -> Spine b
fmap :: forall a b. (a -> b) -> Spine a -> Spine b
$c<$ :: forall a b. a -> Spine b -> Spine a
<$ :: forall a b. a -> Spine b -> Spine a
Functor)
data HeadSpine a
= HeadOnly a
| HeadSpine a (Spine a)
deriving stock (Int -> HeadSpine a -> [Char] -> [Char]
[HeadSpine a] -> [Char] -> [Char]
HeadSpine a -> [Char]
(Int -> HeadSpine a -> [Char] -> [Char])
-> (HeadSpine a -> [Char])
-> ([HeadSpine a] -> [Char] -> [Char])
-> Show (HeadSpine a)
forall a. Show a => Int -> HeadSpine a -> [Char] -> [Char]
forall a. Show a => [HeadSpine a] -> [Char] -> [Char]
forall a. Show a => HeadSpine a -> [Char]
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: forall a. Show a => Int -> HeadSpine a -> [Char] -> [Char]
showsPrec :: Int -> HeadSpine a -> [Char] -> [Char]
$cshow :: forall a. Show a => HeadSpine a -> [Char]
show :: HeadSpine a -> [Char]
$cshowList :: forall a. Show a => [HeadSpine a] -> [Char] -> [Char]
showList :: [HeadSpine a] -> [Char] -> [Char]
Show, HeadSpine a -> HeadSpine a -> Bool
(HeadSpine a -> HeadSpine a -> Bool)
-> (HeadSpine a -> HeadSpine a -> Bool) -> Eq (HeadSpine a)
forall a. Eq a => HeadSpine a -> HeadSpine a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => HeadSpine a -> HeadSpine a -> Bool
== :: HeadSpine a -> HeadSpine a -> Bool
$c/= :: forall a. Eq a => HeadSpine a -> HeadSpine a -> Bool
/= :: HeadSpine a -> HeadSpine a -> Bool
Eq, (forall a b. (a -> b) -> HeadSpine a -> HeadSpine b)
-> (forall a b. a -> HeadSpine b -> HeadSpine a)
-> Functor HeadSpine
forall a b. a -> HeadSpine b -> HeadSpine a
forall a b. (a -> b) -> HeadSpine a -> HeadSpine b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> HeadSpine a -> HeadSpine b
fmap :: forall a b. (a -> b) -> HeadSpine a -> HeadSpine b
$c<$ :: forall a b. a -> HeadSpine b -> HeadSpine a
<$ :: forall a b. a -> HeadSpine b -> HeadSpine a
Functor, (forall m. Monoid m => HeadSpine m -> m)
-> (forall m a. Monoid m => (a -> m) -> HeadSpine a -> m)
-> (forall m a. Monoid m => (a -> m) -> HeadSpine a -> m)
-> (forall a b. (a -> b -> b) -> b -> HeadSpine a -> b)
-> (forall a b. (a -> b -> b) -> b -> HeadSpine a -> b)
-> (forall b a. (b -> a -> b) -> b -> HeadSpine a -> b)
-> (forall b a. (b -> a -> b) -> b -> HeadSpine a -> b)
-> (forall a. (a -> a -> a) -> HeadSpine a -> a)
-> (forall a. (a -> a -> a) -> HeadSpine a -> a)
-> (forall a. HeadSpine a -> [a])
-> (forall a. HeadSpine a -> Bool)
-> (forall a. HeadSpine a -> Int)
-> (forall a. Eq a => a -> HeadSpine a -> Bool)
-> (forall a. Ord a => HeadSpine a -> a)
-> (forall a. Ord a => HeadSpine a -> a)
-> (forall a. Num a => HeadSpine a -> a)
-> (forall a. Num a => HeadSpine a -> a)
-> Foldable HeadSpine
forall a. Eq a => a -> HeadSpine a -> Bool
forall a. Num a => HeadSpine a -> a
forall a. Ord a => HeadSpine a -> a
forall m. Monoid m => HeadSpine m -> m
forall a. HeadSpine a -> Bool
forall a. HeadSpine a -> Int
forall a. HeadSpine a -> [a]
forall a. (a -> a -> a) -> HeadSpine a -> a
forall m a. Monoid m => (a -> m) -> HeadSpine a -> m
forall b a. (b -> a -> b) -> b -> HeadSpine a -> b
forall a b. (a -> b -> b) -> b -> HeadSpine a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => HeadSpine m -> m
fold :: forall m. Monoid m => HeadSpine m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> HeadSpine a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> HeadSpine a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> HeadSpine a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> HeadSpine a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> HeadSpine a -> b
foldr :: forall a b. (a -> b -> b) -> b -> HeadSpine a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> HeadSpine a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> HeadSpine a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> HeadSpine a -> b
foldl :: forall b a. (b -> a -> b) -> b -> HeadSpine a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> HeadSpine a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> HeadSpine a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> HeadSpine a -> a
foldr1 :: forall a. (a -> a -> a) -> HeadSpine a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> HeadSpine a -> a
foldl1 :: forall a. (a -> a -> a) -> HeadSpine a -> a
$ctoList :: forall a. HeadSpine a -> [a]
toList :: forall a. HeadSpine a -> [a]
$cnull :: forall a. HeadSpine a -> Bool
null :: forall a. HeadSpine a -> Bool
$clength :: forall a. HeadSpine a -> Int
length :: forall a. HeadSpine a -> Int
$celem :: forall a. Eq a => a -> HeadSpine a -> Bool
elem :: forall a. Eq a => a -> HeadSpine a -> Bool
$cmaximum :: forall a. Ord a => HeadSpine a -> a
maximum :: forall a. Ord a => HeadSpine a -> a
$cminimum :: forall a. Ord a => HeadSpine a -> a
minimum :: forall a. Ord a => HeadSpine a -> a
$csum :: forall a. Num a => HeadSpine a -> a
sum :: forall a. Num a => HeadSpine a -> a
$cproduct :: forall a. Num a => HeadSpine a -> a
product :: forall a. Num a => HeadSpine a -> a
Foldable)
instance Pretty a => Pretty (Spine a) where pretty :: forall ann. Spine a -> Doc ann
pretty = [Identity a] -> Doc ann
forall ann. [Identity a] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([Identity a] -> Doc ann)
-> (Spine a -> [Identity a]) -> Spine a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity a) -> [a] -> [Identity a]
forall a b. (a -> b) -> [a] -> [b]
map a -> Identity a
forall a. a -> Identity a
Identity ([a] -> [Identity a])
-> (Spine a -> [a]) -> Spine a -> [Identity a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Spine a -> [a]
forall a. Spine a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList
instance PrettyBy config a => DefaultPrettyBy config (Spine a)
deriving via PrettyCommon (Spine a)
instance PrettyDefaultBy config (Spine a) => PrettyBy config (Spine a)
instance Pretty a => Pretty (HeadSpine a) where
pretty :: forall ann. HeadSpine a -> Doc ann
pretty (HeadOnly a
x) = a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
x
pretty (HeadSpine a
f Spine a
xs) = a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
f Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"`applyN`" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Spine a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Spine a -> Doc ann
pretty Spine a
xs
instance PrettyBy config a => DefaultPrettyBy config (HeadSpine a)
deriving via PrettyCommon (HeadSpine a)
instance PrettyDefaultBy config (HeadSpine a) => PrettyBy config (HeadSpine a)
class uni ~ UniOf val => MakeKnownIn uni val a where
makeKnown :: a -> BuiltinResult (HeadSpine val)
default makeKnown :: KnownBuiltinType val a => a -> BuiltinResult (HeadSpine val)
makeKnown a
x = HeadSpine val -> BuiltinResult (HeadSpine val)
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (HeadSpine val -> BuiltinResult (HeadSpine val))
-> (a -> HeadSpine val) -> a -> BuiltinResult (HeadSpine val)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. val -> HeadSpine val
forall a. a -> HeadSpine a
HeadOnly (val -> HeadSpine val) -> (a -> val) -> a -> HeadSpine val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> val
forall a term.
(HasConstant term, HasTermLevel (UniOf term) a) =>
a -> term
fromValue (a -> BuiltinResult (HeadSpine val))
-> a -> BuiltinResult (HeadSpine val)
forall a b. (a -> b) -> a -> b
$! a
x
{-# INLINE makeKnown #-}
type MakeKnown val = MakeKnownIn (UniOf val) val
class uni ~ UniOf val => ReadKnownIn uni val a where
readKnown :: val -> ReadKnownM a
default readKnown :: KnownBuiltinType val a => val -> ReadKnownM a
readKnown = (val -> ReadKnownM a) -> val -> ReadKnownM a
forall a. a -> a
inline val -> ReadKnownM a
forall val a. KnownBuiltinType val a => val -> ReadKnownM a
readKnownConstant
{-# INLINE readKnown #-}
type ReadKnown val = ReadKnownIn (UniOf val) val
makeKnownOrFail :: MakeKnownIn uni val a => a -> EvaluationResult (HeadSpine val)
makeKnownOrFail :: forall (uni :: * -> *) val a.
MakeKnownIn uni val a =>
a -> EvaluationResult (HeadSpine val)
makeKnownOrFail a
x = case a -> BuiltinResult (HeadSpine val)
forall (uni :: * -> *) val a.
MakeKnownIn uni val a =>
a -> BuiltinResult (HeadSpine val)
makeKnown a
x of
BuiltinSuccess HeadSpine val
val -> HeadSpine val -> EvaluationResult (HeadSpine val)
forall a. a -> EvaluationResult a
EvaluationSuccess HeadSpine val
val
BuiltinSuccessWithLogs DList Text
_ HeadSpine val
val -> HeadSpine val -> EvaluationResult (HeadSpine val)
forall a. a -> EvaluationResult a
EvaluationSuccess HeadSpine val
val
BuiltinFailure DList Text
_ BuiltinError
_ -> EvaluationResult (HeadSpine val)
forall a. EvaluationResult a
EvaluationFailure
{-# INLINE makeKnownOrFail #-}
readKnownSelf
:: (ReadKnown val a, AsUnliftingEvaluationError err, AsEvaluationFailure err)
=> val -> Either (ErrorWithCause err val) a
readKnownSelf :: forall val a err.
(ReadKnown val a, AsUnliftingEvaluationError err,
AsEvaluationFailure err) =>
val -> Either (ErrorWithCause err val) a
readKnownSelf val
val = (BuiltinError -> Either (ErrorWithCause err val) a)
-> Either BuiltinError a -> Either (ErrorWithCause err val) a
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Either a b -> m b
fromRightM (val -> BuiltinError -> Either (ErrorWithCause err val) a
forall err cause (m :: * -> *) void.
(MonadError (ErrorWithCause err cause) m,
AsUnliftingEvaluationError err, AsEvaluationFailure err) =>
cause -> BuiltinError -> m void
throwBuiltinErrorWithCause val
val) (Either BuiltinError a -> Either (ErrorWithCause err val) a)
-> Either BuiltinError a -> Either (ErrorWithCause err val) a
forall a b. (a -> b) -> a -> b
$ val -> Either BuiltinError a
forall (uni :: * -> *) val a.
ReadKnownIn uni val a =>
val -> ReadKnownM a
readKnown val
val
{-# INLINE readKnownSelf #-}
instance MakeKnownIn uni val a => MakeKnownIn uni val (BuiltinResult a) where
makeKnown :: BuiltinResult a -> BuiltinResult (HeadSpine val)
makeKnown BuiltinResult a
res = BuiltinResult a
res BuiltinResult a
-> (a -> BuiltinResult (HeadSpine val))
-> BuiltinResult (HeadSpine val)
forall a b.
BuiltinResult a -> (a -> BuiltinResult b) -> BuiltinResult b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> BuiltinResult (HeadSpine val)
forall (uni :: * -> *) val a.
MakeKnownIn uni val a =>
a -> BuiltinResult (HeadSpine val)
makeKnown
{-# INLINE makeKnown #-}
instance
( TypeError ('Text "‘BuiltinResult’ cannot appear in the type of an argument")
, uni ~ UniOf val
) => ReadKnownIn uni val (BuiltinResult a) where
readKnown :: val -> ReadKnownM (BuiltinResult a)
readKnown val
_ = ReadKnownM (BuiltinResult a)
forall (m :: * -> *) void. MonadError BuiltinError m => m void
throwUnderTypeError
{-# INLINE readKnown #-}
instance
( TypeError ('Text "Use ‘BuiltinResult’ instead of ‘EvaluationResult’")
, uni ~ UniOf val
) => MakeKnownIn uni val (EvaluationResult a) where
makeKnown :: EvaluationResult a -> BuiltinResult (HeadSpine val)
makeKnown EvaluationResult a
_ = BuiltinResult (HeadSpine val)
forall (m :: * -> *) void. MonadError BuiltinError m => m void
throwUnderTypeError
{-# INLINE makeKnown #-}
instance
( TypeError ('Text "Use ‘BuiltinResult’ instead of ‘EvaluationResult’")
, uni ~ UniOf val
) => ReadKnownIn uni val (EvaluationResult a) where
readKnown :: val -> ReadKnownM (EvaluationResult a)
readKnown val
_ = ReadKnownM (EvaluationResult a)
forall (m :: * -> *) void. MonadError BuiltinError m => m void
throwUnderTypeError
{-# INLINE readKnown #-}
instance HasConstantIn uni val => MakeKnownIn uni val (SomeConstant uni rep) where
makeKnown :: SomeConstant uni rep -> BuiltinResult (HeadSpine val)
makeKnown = (Some (ValueOf uni) -> BuiltinResult (HeadSpine val))
-> SomeConstant uni rep -> BuiltinResult (HeadSpine val)
forall a b s. Coercible a b => (a -> s) -> b -> s
coerceArg ((Some (ValueOf uni) -> BuiltinResult (HeadSpine val))
-> SomeConstant uni rep -> BuiltinResult (HeadSpine val))
-> (Some (ValueOf uni) -> BuiltinResult (HeadSpine val))
-> SomeConstant uni rep
-> BuiltinResult (HeadSpine val)
forall a b. (a -> b) -> a -> b
$ HeadSpine val -> BuiltinResult (HeadSpine val)
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (HeadSpine val -> BuiltinResult (HeadSpine val))
-> (Some (ValueOf uni) -> HeadSpine val)
-> Some (ValueOf uni)
-> BuiltinResult (HeadSpine val)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. val -> HeadSpine val
forall a. a -> HeadSpine a
HeadOnly (val -> HeadSpine val)
-> (Some (ValueOf uni) -> val)
-> Some (ValueOf uni)
-> HeadSpine val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Some (ValueOf uni) -> val
Some (ValueOf (UniOf val)) -> val
forall term.
HasConstant term =>
Some (ValueOf (UniOf term)) -> term
fromConstant
{-# INLINE makeKnown #-}
instance HasConstantIn uni val => ReadKnownIn uni val (SomeConstant uni rep) where
readKnown :: val -> ReadKnownM (SomeConstant uni rep)
readKnown = ((val -> Either BuiltinError (Some (ValueOf uni)))
-> val -> ReadKnownM (SomeConstant uni rep))
-> (val -> Either BuiltinError (Some (ValueOf uni)))
-> val
-> ReadKnownM (SomeConstant uni rep)
forall a b. Coercible a b => (a -> b) -> a -> b
coerceVia ((Some (ValueOf uni) -> SomeConstant uni rep)
-> Either BuiltinError (Some (ValueOf uni))
-> ReadKnownM (SomeConstant uni rep)
forall a b.
(a -> b) -> Either BuiltinError a -> Either BuiltinError b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Some (ValueOf uni) -> SomeConstant uni rep
forall (uni :: * -> *) rep.
Some (ValueOf uni) -> SomeConstant uni rep
SomeConstant (Either BuiltinError (Some (ValueOf uni))
-> ReadKnownM (SomeConstant uni rep))
-> (val -> Either BuiltinError (Some (ValueOf uni)))
-> val
-> ReadKnownM (SomeConstant uni rep)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) val -> Either BuiltinError (Some (ValueOf uni))
val -> Either BuiltinError (Some (ValueOf (UniOf val)))
forall term.
HasConstant term =>
term -> Either BuiltinError (Some (ValueOf (UniOf term)))
asConstant
{-# INLINE readKnown #-}
instance uni ~ UniOf val => MakeKnownIn uni val (Opaque val rep) where
makeKnown :: Opaque val rep -> BuiltinResult (HeadSpine val)
makeKnown = (val -> BuiltinResult (HeadSpine val))
-> Opaque val rep -> BuiltinResult (HeadSpine val)
forall a b s. Coercible a b => (a -> s) -> b -> s
coerceArg ((val -> BuiltinResult (HeadSpine val))
-> Opaque val rep -> BuiltinResult (HeadSpine val))
-> (val -> BuiltinResult (HeadSpine val))
-> Opaque val rep
-> BuiltinResult (HeadSpine val)
forall a b. (a -> b) -> a -> b
$ HeadSpine val -> BuiltinResult (HeadSpine val)
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (HeadSpine val -> BuiltinResult (HeadSpine val))
-> (val -> HeadSpine val) -> val -> BuiltinResult (HeadSpine val)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. val -> HeadSpine val
forall a. a -> HeadSpine a
HeadOnly
{-# INLINE makeKnown #-}
instance uni ~ UniOf val => ReadKnownIn uni val (Opaque val rep) where
readKnown :: val -> ReadKnownM (Opaque val rep)
readKnown = (Opaque val rep -> ReadKnownM (Opaque val rep))
-> val -> ReadKnownM (Opaque val rep)
forall a b s. Coercible a b => (a -> s) -> b -> s
coerceArg Opaque val rep -> ReadKnownM (Opaque val rep)
forall a. a -> Either BuiltinError a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE readKnown #-}
instance uni ~ UniOf val => MakeKnownIn uni val (Opaque (HeadSpine val) rep) where
makeKnown :: Opaque (HeadSpine val) rep -> BuiltinResult (HeadSpine val)
makeKnown = (HeadSpine val -> BuiltinResult (HeadSpine val))
-> Opaque (HeadSpine val) rep -> BuiltinResult (HeadSpine val)
forall a b s. Coercible a b => (a -> s) -> b -> s
coerceArg HeadSpine val -> BuiltinResult (HeadSpine val)
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE makeKnown #-}