{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module PlutusCore.Builtin.KnownType
( BuiltinError
, GEqL (..)
, LoopBreaker (..)
, KnownBuiltinTypeIn
, KnownBuiltinType
, BuiltinResult (..)
, ReadKnownM
, Spine (..)
, HeadSpine (..)
, headSpine
, MonoHeadSpine
, 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.Machine.Exception
import PlutusCore.Evaluation.Result
import PlutusCore.Pretty
import Control.Monad.Except
import Data.Bifunctor
import Data.Either.Extras
import Data.Functor.Identity
import Data.Kind qualified as GHC
import Data.String
import GHC.Exts (inline, oneShot)
import GHC.TypeLits
import Prettyprinter
import Text.PrettyBy.Internal
import Universe
type GEqL :: (GHC.Type -> GHC.Type) -> GHC.Type -> GHC.Constraint
class GEqL f a where
geqL :: f (Esc a) -> f (Esc b) -> EvaluationResult (a :~: b)
newtype LoopBreaker uni a = LoopBreaker (uni a)
instance GEqL uni a => GEqL (LoopBreaker uni) a where
geqL :: forall b.
LoopBreaker uni (Esc a)
-> LoopBreaker uni (Esc b) -> EvaluationResult (a :~: b)
geqL = (uni (Esc a) -> uni (Esc b) -> EvaluationResult (a :~: b))
-> LoopBreaker uni (Esc a)
-> LoopBreaker uni (Esc b)
-> EvaluationResult (a :~: b)
forall a b. Coercible a b => a -> b
coerce ((uni (Esc a) -> uni (Esc b) -> EvaluationResult (a :~: b))
-> LoopBreaker uni (Esc a)
-> LoopBreaker uni (Esc b)
-> EvaluationResult (a :~: b))
-> (uni (Esc a) -> uni (Esc b) -> EvaluationResult (a :~: b))
-> LoopBreaker uni (Esc a)
-> LoopBreaker uni (Esc b)
-> EvaluationResult (a :~: b)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b.
GEqL f a =>
f (Esc a) -> f (Esc b) -> EvaluationResult (a :~: b)
geqL @uni
{-# INLINE geqL #-}
type KnownBuiltinTypeIn uni val a =
(HasConstantIn uni val, PrettyParens (SomeTypeIn uni), GEqL uni a, 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
StructuralError (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) -> EvaluationResult (a :~: a)
forall b.
UniOf val (Esc a)
-> UniOf val (Esc b) -> EvaluationResult (a :~: b)
forall (f :: * -> *) a b.
GEqL f a =>
f (Esc a) -> f (Esc b) -> EvaluationResult (a :~: b)
`geqL` UniOf val (Esc a)
uniAct of
EvaluationSuccess a :~: a
Refl -> a -> Either BuiltinError a
forall a. a -> Either BuiltinError a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a
x
EvaluationResult (a :~: a)
EvaluationFailure ->
BuiltinError -> Either BuiltinError a
forall a. BuiltinError -> Either BuiltinError a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (BuiltinError -> Either BuiltinError a)
-> (UnliftingEvaluationError -> BuiltinError)
-> UnliftingEvaluationError
-> Either BuiltinError a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnliftingEvaluationError -> BuiltinError
BuiltinUnliftingEvaluationError (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 err a b
= HeadOnly a
| HeadSpine a (Spine b)
| ~err
deriving stock (Int -> HeadSpine err a b -> [Char] -> [Char]
[HeadSpine err a b] -> [Char] -> [Char]
HeadSpine err a b -> [Char]
(Int -> HeadSpine err a b -> [Char] -> [Char])
-> (HeadSpine err a b -> [Char])
-> ([HeadSpine err a b] -> [Char] -> [Char])
-> Show (HeadSpine err a b)
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
forall err a b.
(Show a, Show b, Show err) =>
Int -> HeadSpine err a b -> [Char] -> [Char]
forall err a b.
(Show a, Show b, Show err) =>
[HeadSpine err a b] -> [Char] -> [Char]
forall err a b.
(Show a, Show b, Show err) =>
HeadSpine err a b -> [Char]
$cshowsPrec :: forall err a b.
(Show a, Show b, Show err) =>
Int -> HeadSpine err a b -> [Char] -> [Char]
showsPrec :: Int -> HeadSpine err a b -> [Char] -> [Char]
$cshow :: forall err a b.
(Show a, Show b, Show err) =>
HeadSpine err a b -> [Char]
show :: HeadSpine err a b -> [Char]
$cshowList :: forall err a b.
(Show a, Show b, Show err) =>
[HeadSpine err a b] -> [Char] -> [Char]
showList :: [HeadSpine err a b] -> [Char] -> [Char]
Show, HeadSpine err a b -> HeadSpine err a b -> Bool
(HeadSpine err a b -> HeadSpine err a b -> Bool)
-> (HeadSpine err a b -> HeadSpine err a b -> Bool)
-> Eq (HeadSpine err a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall err a b.
(Eq a, Eq b, Eq err) =>
HeadSpine err a b -> HeadSpine err a b -> Bool
$c== :: forall err a b.
(Eq a, Eq b, Eq err) =>
HeadSpine err a b -> HeadSpine err a b -> Bool
== :: HeadSpine err a b -> HeadSpine err a b -> Bool
$c/= :: forall err a b.
(Eq a, Eq b, Eq err) =>
HeadSpine err a b -> HeadSpine err a b -> Bool
/= :: HeadSpine err a b -> HeadSpine err a b -> Bool
Eq, (forall a b. (a -> b) -> HeadSpine err a a -> HeadSpine err a b)
-> (forall a b. a -> HeadSpine err a b -> HeadSpine err a a)
-> Functor (HeadSpine err a)
forall a b. a -> HeadSpine err a b -> HeadSpine err a a
forall a b. (a -> b) -> HeadSpine err a a -> HeadSpine err a b
forall err a a b. a -> HeadSpine err a b -> HeadSpine err a a
forall err a a b.
(a -> b) -> HeadSpine err a a -> HeadSpine err a b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall err a a b.
(a -> b) -> HeadSpine err a a -> HeadSpine err a b
fmap :: forall a b. (a -> b) -> HeadSpine err a a -> HeadSpine err a b
$c<$ :: forall err a a b. a -> HeadSpine err a b -> HeadSpine err a a
<$ :: forall a b. a -> HeadSpine err a b -> HeadSpine err a a
Functor)
type MonoHeadSpine err a = HeadSpine err a a
instance Bifunctor (HeadSpine err) where
bimap :: forall a b c d.
(a -> b) -> (c -> d) -> HeadSpine err a c -> HeadSpine err b d
bimap a -> b
_ c -> d
_ (HeadError err
x) = err -> HeadSpine err b d
forall err a b. err -> HeadSpine err a b
HeadError err
x
bimap a -> b
headF c -> d
_ (HeadOnly a
a) = b -> HeadSpine err b d
forall err a b. a -> HeadSpine err a b
HeadOnly (b -> HeadSpine err b d) -> b -> HeadSpine err b d
forall a b. (a -> b) -> a -> b
$ a -> b
headF a
a
bimap a -> b
headF c -> d
spineF (HeadSpine a
a Spine c
b) = b -> Spine d -> HeadSpine err b d
forall err a b. a -> Spine b -> HeadSpine err a b
HeadSpine (a -> b
headF a
a) (c -> d
spineF (c -> d) -> Spine c -> Spine d
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Spine c
b)
headSpine :: a -> [b] -> HeadSpine err a b
headSpine :: forall a b err. a -> [b] -> HeadSpine err a b
headSpine a
h [] = a -> HeadSpine err a b
forall err a b. a -> HeadSpine err a b
HeadOnly a
h
headSpine a
h (b
x : [b]
xs) =
a -> Spine b -> HeadSpine err a b
forall err a b. a -> Spine b -> HeadSpine err a b
HeadSpine a
h (Spine b -> HeadSpine err a b) -> Spine b -> HeadSpine err a b
forall a b. (a -> b) -> a -> b
$ (b -> (b -> Spine b) -> b -> Spine b)
-> (b -> Spine b) -> [b] -> b -> Spine b
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\b
x2 b -> Spine b
r b
x1 -> b -> Spine b -> Spine b
forall a. a -> Spine a -> Spine a
SpineCons b
x1 (Spine b -> Spine b) -> Spine b -> Spine b
forall a b. (a -> b) -> a -> b
$ b -> Spine b
r b
x2) b -> Spine b
forall a. a -> Spine a
SpineLast [b]
xs b
x
{-# INLINE headSpine #-}
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 err, Pretty a, Pretty b) => Pretty (HeadSpine err a b) where
pretty :: forall ann. HeadSpine err a b -> Doc ann
pretty (HeadError err
x) = Doc ann
"HeadError" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> err -> Doc ann
forall ann. err -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty err
x
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 b
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 b -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Spine b -> Doc ann
pretty Spine b
xs
instance
(PrettyBy config err, PrettyBy config a, PrettyBy config (Spine b))
=> DefaultPrettyBy config (HeadSpine err a b)
where
defaultPrettyBy :: forall ann. config -> HeadSpine err a b -> Doc ann
defaultPrettyBy config
config (HeadError err
x) = Doc ann
"HeadError" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> config -> err -> Doc ann
forall ann. config -> err -> Doc ann
forall config a ann. PrettyBy config a => config -> a -> Doc ann
prettyBy config
config err
x
defaultPrettyBy config
config (HeadOnly a
x) = config -> a -> Doc ann
forall ann. config -> a -> Doc ann
forall config a ann. PrettyBy config a => config -> a -> Doc ann
prettyBy config
config a
x
defaultPrettyBy config
config (HeadSpine a
f Spine b
xs) = config -> a -> Doc ann
forall ann. config -> a -> Doc ann
forall config a ann. PrettyBy config a => config -> a -> Doc ann
prettyBy config
config 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
<+> config -> Spine b -> Doc ann
forall ann. config -> Spine b -> Doc ann
forall config a ann. PrettyBy config a => config -> a -> Doc ann
prettyBy config
config Spine b
xs
deriving via
PrettyCommon (HeadSpine err a b)
instance
PrettyDefaultBy config (HeadSpine err a b) => PrettyBy config (HeadSpine err a b)
class uni ~ UniOf val => MakeKnownIn uni val a where
makeKnown :: a -> BuiltinResult val
default makeKnown :: KnownBuiltinType val a => a -> BuiltinResult val
makeKnown a
x = val -> BuiltinResult val
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (val -> BuiltinResult val) -> (a -> val) -> a -> BuiltinResult 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 val) -> a -> BuiltinResult 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 val
makeKnownOrFail :: forall (uni :: * -> *) val a.
MakeKnownIn uni val a =>
a -> EvaluationResult val
makeKnownOrFail a
x = case a -> BuiltinResult val
forall (uni :: * -> *) val a.
MakeKnownIn uni val a =>
a -> BuiltinResult val
makeKnown a
x of
BuiltinSuccess val
val -> val -> EvaluationResult val
forall a. a -> EvaluationResult a
EvaluationSuccess val
val
BuiltinSuccessWithLogs DList Text
_ val
val -> val -> EvaluationResult val
forall a. a -> EvaluationResult a
EvaluationSuccess val
val
BuiltinFailure DList Text
_ BuiltinError
_ -> EvaluationResult val
forall a. EvaluationResult a
EvaluationFailure
{-# INLINE makeKnownOrFail #-}
readKnownSelf
:: (ReadKnown val a, BuiltinErrorToEvaluationError structural operational)
=> val -> Either (ErrorWithCause (EvaluationError structural operational) val) a
readKnownSelf :: forall val a structural operational.
(ReadKnown val a,
BuiltinErrorToEvaluationError structural operational) =>
val
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a
readKnownSelf val
val =
(BuiltinError
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a)
-> Either BuiltinError a
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Either a b -> m b
fromRightM ((EvaluationError structural operational
-> val
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a)
-> val
-> EvaluationError structural operational
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a
forall a b c. (a -> b -> c) -> b -> a -> c
flip EvaluationError structural operational
-> val
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a
forall e cause (m :: * -> *) x.
MonadError (ErrorWithCause e cause) m =>
e -> cause -> m x
throwErrorWithCause val
val (EvaluationError structural operational
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a)
-> (BuiltinError -> EvaluationError structural operational)
-> BuiltinError
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinError -> EvaluationError structural operational
forall structural operational.
BuiltinErrorToEvaluationError structural operational =>
BuiltinError -> EvaluationError structural operational
builtinErrorToEvaluationError) (Either BuiltinError a
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a)
-> Either BuiltinError a
-> Either
(ErrorWithCause (EvaluationError structural operational) 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 val
makeKnown BuiltinResult a
res = BuiltinResult a
res BuiltinResult a -> (a -> BuiltinResult val) -> BuiltinResult 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 val
forall (uni :: * -> *) val a.
MakeKnownIn uni val a =>
a -> BuiltinResult 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
_ = BuiltinError -> ReadKnownM (BuiltinResult a)
forall a. BuiltinError -> Either BuiltinError a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError BuiltinError
underTypeError
{-# INLINE readKnown #-}
instance
( TypeError ('Text "Use ‘BuiltinResult’ instead of ‘EvaluationResult’")
, uni ~ UniOf val
)
=> MakeKnownIn uni val (EvaluationResult a)
where
makeKnown :: EvaluationResult a -> BuiltinResult val
makeKnown EvaluationResult a
_ = BuiltinError -> BuiltinResult val
forall a. BuiltinError -> BuiltinResult a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError BuiltinError
underTypeError
{-# 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
_ = BuiltinError -> ReadKnownM (EvaluationResult a)
forall a. BuiltinError -> Either BuiltinError a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError BuiltinError
underTypeError
{-# INLINE readKnown #-}
instance HasConstantIn uni val => MakeKnownIn uni val (SomeConstant uni rep) where
makeKnown :: SomeConstant uni rep -> BuiltinResult val
makeKnown = (Some (ValueOf uni) -> BuiltinResult val)
-> SomeConstant uni rep -> BuiltinResult val
forall a b s. Coercible a b => (a -> s) -> b -> s
coerceArg ((Some (ValueOf uni) -> BuiltinResult val)
-> SomeConstant uni rep -> BuiltinResult val)
-> (Some (ValueOf uni) -> BuiltinResult val)
-> SomeConstant uni rep
-> BuiltinResult val
forall a b. (a -> b) -> a -> b
$ val -> BuiltinResult val
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (val -> BuiltinResult val)
-> (Some (ValueOf uni) -> val)
-> Some (ValueOf uni)
-> BuiltinResult 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 = (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. Coercible b c => (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 val
makeKnown = (val -> BuiltinResult val) -> Opaque val rep -> BuiltinResult val
forall a b s. Coercible a b => (a -> s) -> b -> s
coerceArg val -> BuiltinResult val
forall a. a -> BuiltinResult a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# 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 #-}