{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
module PlutusCore.Builtin.KnownType
( KnownBuiltinTypeIn
, KnownBuiltinType
, readKnownConstant
, KnownTypeIn (..)
, KnownType
, TestTypesFromTheUniverseAreAllKnown
, readKnownSelf
, makeKnownOrFail
) where
import PlutusCore.Builtin.Emitter
import PlutusCore.Builtin.HasConstant
import PlutusCore.Builtin.KnownTypeAst
import PlutusCore.Builtin.Polymorphism
import PlutusCore.Core
import PlutusCore.Evaluation.Machine.Exception
import PlutusCore.Evaluation.Result
import Control.Monad.Except
import Data.Coerce
import Data.Kind qualified as GHC (Type)
import Data.String
import Data.Text (Text)
import GHC.Exts (inline, oneShot)
import Universe
type KnownBuiltinTypeIn uni val a = (HasConstantIn uni val, GShow uni, GEq uni, uni `Contains` a)
type KnownBuiltinType val a = KnownBuiltinTypeIn (UniOf val) val a
readKnownConstant
:: forall val a err cause. (AsUnliftingError err, KnownBuiltinType val a)
=> Maybe cause -> val -> Either (ErrorWithCause err cause) a
readKnownConstant :: Maybe cause -> val -> Either (ErrorWithCause err cause) a
readKnownConstant Maybe cause
mayCause val
val = Maybe cause
-> val
-> Either (ErrorWithCause err cause) (Some (ValueOf (UniOf val)))
forall term err cause (m :: * -> *).
(AsConstant term, MonadError (ErrorWithCause err cause) m,
AsUnliftingError err) =>
Maybe cause -> term -> m (Some (ValueOf (UniOf term)))
asConstant Maybe cause
mayCause val
val Either (ErrorWithCause err cause) (Some (ValueOf (UniOf val)))
-> (Some (ValueOf (UniOf val))
-> Either (ErrorWithCause err cause) a)
-> Either (ErrorWithCause err cause) a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Some (ValueOf (UniOf val)) -> Either (ErrorWithCause err cause) a)
-> Some (ValueOf (UniOf val))
-> Either (ErrorWithCause err cause) a
oneShot \case
Some (ValueOf uniAct x) -> do
let uniExp :: UniOf val (Esc a)
uniExp = Contains (UniOf val) a => UniOf val (Esc a)
forall k (uni :: * -> *) (a :: k). Contains uni a => uni (Esc a)
knownUni @_ @(UniOf val) @a
case UniOf val (Esc a)
uniAct UniOf val (Esc a) -> UniOf val (Esc a) -> Maybe (Esc a :~: Esc a)
forall k (f :: k -> *) (a :: k) (b :: k).
GEq f =>
f a -> f b -> Maybe (a :~: b)
`geq` UniOf val (Esc a)
uniExp of
Just Esc a :~: Esc a
Refl -> a -> Either (ErrorWithCause err cause) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
Maybe (Esc a :~: Esc a)
Nothing -> do
let err :: UnliftingError
err = String -> UnliftingError
forall a. IsString a => String -> a
fromString (String -> UnliftingError) -> String -> UnliftingError
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Type mismatch: "
, String
"expected: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ UniOf val (Esc a) -> String
forall k (t :: k -> *) (a :: k). GShow t => t a -> String
gshow UniOf val (Esc a)
uniExp
, String
"; actual: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ UniOf val (Esc a) -> String
forall k (t :: k -> *) (a :: k). GShow t => t a -> String
gshow UniOf val (Esc a)
uniAct
]
AReview err UnliftingError
-> UnliftingError
-> Maybe cause
-> Either (ErrorWithCause err cause) a
forall exc e t term (m :: * -> *) x.
(exc ~ ErrorWithCause e term, MonadError exc m) =>
AReview e t -> t -> Maybe term -> m x
throwingWithCause AReview err UnliftingError
forall r. AsUnliftingError r => Prism' r UnliftingError
_UnliftingError UnliftingError
err Maybe cause
mayCause
{-# INLINE readKnownConstant #-}
class uni ~ UniOf val => KnownTypeIn uni val a where
makeKnown
:: ( MonadError (ErrorWithCause err cause) m, AsEvaluationFailure err
)
=> (Text -> m ()) -> Maybe cause -> a -> m val
default makeKnown
:: ( MonadError (ErrorWithCause err cause) m
, KnownBuiltinType val a
)
=> (Text -> m ()) -> Maybe cause -> a -> m val
makeKnown Text -> m ()
_ Maybe cause
_ a
x = val -> m val
forall (f :: * -> *) a. Applicative f => a -> f a
pure (val -> m val) -> (a -> val) -> a -> m val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Some (ValueOf uni) -> val
forall term.
FromConstant term =>
Some (ValueOf (UniOf term)) -> term
fromConstant (Some (ValueOf uni) -> val)
-> (a -> Some (ValueOf uni)) -> a -> val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Some (ValueOf uni)
forall a (uni :: * -> *). Includes uni a => a -> Some (ValueOf uni)
someValue (a -> m val) -> a -> m val
forall a b. (a -> b) -> a -> b
$! a
x
{-# INLINE makeKnown #-}
readKnown
:: ( AsUnliftingError err, AsEvaluationFailure err
)
=> Maybe cause -> val -> Either (ErrorWithCause err cause) a
default readKnown
:: ( AsUnliftingError err
, KnownBuiltinType val a
)
=> Maybe cause -> val -> Either (ErrorWithCause err cause) a
readKnown = (Maybe cause -> val -> Either (ErrorWithCause err cause) a)
-> Maybe cause -> val -> Either (ErrorWithCause err cause) a
forall a. a -> a
inline Maybe cause -> val -> Either (ErrorWithCause err cause) a
forall val a err cause.
(AsUnliftingError err, KnownBuiltinType val a) =>
Maybe cause -> val -> Either (ErrorWithCause err cause) a
readKnownConstant
{-# INLINE readKnown #-}
type KnownType val a = (KnownTypeAst (UniOf val) a, KnownTypeIn (UniOf val) val a)
readKnownSelf
:: ( KnownType val a
, AsUnliftingError err, AsEvaluationFailure err
)
=> val -> Either (ErrorWithCause err val) a
readKnownSelf :: val -> Either (ErrorWithCause err val) a
readKnownSelf val
val = Maybe val -> val -> Either (ErrorWithCause err val) a
forall (uni :: * -> *) val a err cause.
(KnownTypeIn uni val a, AsUnliftingError err,
AsEvaluationFailure err) =>
Maybe cause -> val -> Either (ErrorWithCause err cause) a
readKnown (val -> Maybe val
forall a. a -> Maybe a
Just val
val) val
val
class (forall val. KnownBuiltinTypeIn uni val a => KnownTypeIn uni val a) =>
ImplementedKnownBuiltinTypeIn uni a
instance (forall val. KnownBuiltinTypeIn uni val a => KnownTypeIn uni val a) =>
ImplementedKnownBuiltinTypeIn uni a
class uni `Everywhere` ImplementedKnownBuiltinTypeIn uni => TestTypesFromTheUniverseAreAllKnown uni
newtype NoCauseT (val :: GHC.Type) m a = NoCauseT
{ NoCauseT val m a -> m a
unNoCauseT :: m a
} deriving newtype (a -> NoCauseT val m b -> NoCauseT val m a
(a -> b) -> NoCauseT val m a -> NoCauseT val m b
(forall a b. (a -> b) -> NoCauseT val m a -> NoCauseT val m b)
-> (forall a b. a -> NoCauseT val m b -> NoCauseT val m a)
-> Functor (NoCauseT val m)
forall a b. a -> NoCauseT val m b -> NoCauseT val m a
forall a b. (a -> b) -> NoCauseT val m a -> NoCauseT val m b
forall val (m :: * -> *) a b.
Functor m =>
a -> NoCauseT val m b -> NoCauseT val m a
forall val (m :: * -> *) a b.
Functor m =>
(a -> b) -> NoCauseT val m a -> NoCauseT val m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> NoCauseT val m b -> NoCauseT val m a
$c<$ :: forall val (m :: * -> *) a b.
Functor m =>
a -> NoCauseT val m b -> NoCauseT val m a
fmap :: (a -> b) -> NoCauseT val m a -> NoCauseT val m b
$cfmap :: forall val (m :: * -> *) a b.
Functor m =>
(a -> b) -> NoCauseT val m a -> NoCauseT val m b
Functor, Functor (NoCauseT val m)
a -> NoCauseT val m a
Functor (NoCauseT val m)
-> (forall a. a -> NoCauseT val m a)
-> (forall a b.
NoCauseT val m (a -> b) -> NoCauseT val m a -> NoCauseT val m b)
-> (forall a b c.
(a -> b -> c)
-> NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m c)
-> (forall a b.
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b)
-> (forall a b.
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m a)
-> Applicative (NoCauseT val m)
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m a
NoCauseT val m (a -> b) -> NoCauseT val m a -> NoCauseT val m b
(a -> b -> c)
-> NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m c
forall a. a -> NoCauseT val m a
forall a b.
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m a
forall a b.
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
forall a b.
NoCauseT val m (a -> b) -> NoCauseT val m a -> NoCauseT val m b
forall a b c.
(a -> b -> c)
-> NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m c
forall val (m :: * -> *). Applicative m => Functor (NoCauseT val m)
forall val (m :: * -> *) a. Applicative m => a -> NoCauseT val m a
forall val (m :: * -> *) a b.
Applicative m =>
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m a
forall val (m :: * -> *) a b.
Applicative m =>
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
forall val (m :: * -> *) a b.
Applicative m =>
NoCauseT val m (a -> b) -> NoCauseT val m a -> NoCauseT val m b
forall val (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c)
-> NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m a
$c<* :: forall val (m :: * -> *) a b.
Applicative m =>
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m a
*> :: NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
$c*> :: forall val (m :: * -> *) a b.
Applicative m =>
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
liftA2 :: (a -> b -> c)
-> NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m c
$cliftA2 :: forall val (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c)
-> NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m c
<*> :: NoCauseT val m (a -> b) -> NoCauseT val m a -> NoCauseT val m b
$c<*> :: forall val (m :: * -> *) a b.
Applicative m =>
NoCauseT val m (a -> b) -> NoCauseT val m a -> NoCauseT val m b
pure :: a -> NoCauseT val m a
$cpure :: forall val (m :: * -> *) a. Applicative m => a -> NoCauseT val m a
$cp1Applicative :: forall val (m :: * -> *). Applicative m => Functor (NoCauseT val m)
Applicative, Applicative (NoCauseT val m)
a -> NoCauseT val m a
Applicative (NoCauseT val m)
-> (forall a b.
NoCauseT val m a -> (a -> NoCauseT val m b) -> NoCauseT val m b)
-> (forall a b.
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b)
-> (forall a. a -> NoCauseT val m a)
-> Monad (NoCauseT val m)
NoCauseT val m a -> (a -> NoCauseT val m b) -> NoCauseT val m b
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
forall a. a -> NoCauseT val m a
forall a b.
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
forall a b.
NoCauseT val m a -> (a -> NoCauseT val m b) -> NoCauseT val m b
forall val (m :: * -> *). Monad m => Applicative (NoCauseT val m)
forall val (m :: * -> *) a. Monad m => a -> NoCauseT val m a
forall val (m :: * -> *) a b.
Monad m =>
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
forall val (m :: * -> *) a b.
Monad m =>
NoCauseT val m a -> (a -> NoCauseT val m b) -> NoCauseT val m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> NoCauseT val m a
$creturn :: forall val (m :: * -> *) a. Monad m => a -> NoCauseT val m a
>> :: NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
$c>> :: forall val (m :: * -> *) a b.
Monad m =>
NoCauseT val m a -> NoCauseT val m b -> NoCauseT val m b
>>= :: NoCauseT val m a -> (a -> NoCauseT val m b) -> NoCauseT val m b
$c>>= :: forall val (m :: * -> *) a b.
Monad m =>
NoCauseT val m a -> (a -> NoCauseT val m b) -> NoCauseT val m b
$cp1Monad :: forall val (m :: * -> *). Monad m => Applicative (NoCauseT val m)
Monad)
instance (MonadError err m, AsEvaluationFailure err) =>
MonadError (ErrorWithCause err val) (NoCauseT val m) where
throwError :: ErrorWithCause err val -> NoCauseT val m a
throwError ErrorWithCause err val
_ = m a -> NoCauseT val m a
forall val (m :: * -> *) a. m a -> NoCauseT val m a
NoCauseT (m a -> NoCauseT val m a) -> m a -> NoCauseT val m a
forall a b. (a -> b) -> a -> b
$ err -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError err
forall err. AsEvaluationFailure err => err
evaluationFailure
NoCauseT m a
a catchError :: NoCauseT val m a
-> (ErrorWithCause err val -> NoCauseT val m a) -> NoCauseT val m a
`catchError` ErrorWithCause err val -> NoCauseT val m a
h =
m a -> NoCauseT val m a
forall val (m :: * -> *) a. m a -> NoCauseT val m a
NoCauseT (m a -> NoCauseT val m a) -> m a -> NoCauseT val m a
forall a b. (a -> b) -> a -> b
$ m a
a m a -> (err -> m a) -> m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` \err
err ->
NoCauseT val m a -> m a
forall val (m :: * -> *) a. NoCauseT val m a -> m a
unNoCauseT (NoCauseT val m a -> m a)
-> (ErrorWithCause err val -> NoCauseT val m a)
-> ErrorWithCause err val
-> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ErrorWithCause err val -> NoCauseT val m a
h (ErrorWithCause err val -> m a) -> ErrorWithCause err val -> m a
forall a b. (a -> b) -> a -> b
$ err -> Maybe val -> ErrorWithCause err val
forall err cause. err -> Maybe cause -> ErrorWithCause err cause
ErrorWithCause err
err Maybe val
forall a. Maybe a
Nothing
makeKnownOrFail :: (KnownType val a, MonadError err m, AsEvaluationFailure err) => a -> m val
makeKnownOrFail :: a -> m val
makeKnownOrFail = NoCauseT Any m val -> m val
forall val (m :: * -> *) a. NoCauseT val m a -> m a
unNoCauseT (NoCauseT Any m val -> m val)
-> (a -> NoCauseT Any m val) -> a -> m val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> NoCauseT Any m ()) -> Maybe Any -> a -> NoCauseT Any m val
forall (uni :: * -> *) val a err cause (m :: * -> *).
(KnownTypeIn uni val a, MonadError (ErrorWithCause err cause) m,
AsEvaluationFailure err) =>
(Text -> m ()) -> Maybe cause -> a -> m val
makeKnown (\Text
_ -> () -> NoCauseT Any m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) Maybe Any
forall a. Maybe a
Nothing
instance KnownTypeIn uni val a => KnownTypeIn uni val (EvaluationResult a) where
makeKnown :: (Text -> m ()) -> Maybe cause -> EvaluationResult a -> m val
makeKnown Text -> m ()
_ Maybe cause
mayCause EvaluationResult a
EvaluationFailure = AReview err () -> () -> Maybe cause -> m val
forall exc e t term (m :: * -> *) x.
(exc ~ ErrorWithCause e term, MonadError exc m) =>
AReview e t -> t -> Maybe term -> m x
throwingWithCause AReview err ()
forall err. AsEvaluationFailure err => Prism' err ()
_EvaluationFailure () Maybe cause
mayCause
makeKnown Text -> m ()
emit Maybe cause
mayCause (EvaluationSuccess a
x) = (Text -> m ()) -> Maybe cause -> a -> m val
forall (uni :: * -> *) val a err cause (m :: * -> *).
(KnownTypeIn uni val a, MonadError (ErrorWithCause err cause) m,
AsEvaluationFailure err) =>
(Text -> m ()) -> Maybe cause -> a -> m val
makeKnown Text -> m ()
emit Maybe cause
mayCause a
x
{-# INLINE makeKnown #-}
readKnown :: Maybe cause
-> val -> Either (ErrorWithCause err cause) (EvaluationResult a)
readKnown Maybe cause
mayCause val
_ =
AReview err UnliftingError
-> UnliftingError
-> Maybe cause
-> Either (ErrorWithCause err cause) (EvaluationResult a)
forall exc e t term (m :: * -> *) x.
(exc ~ ErrorWithCause e term, MonadError exc m) =>
AReview e t -> t -> Maybe term -> m x
throwingWithCause AReview err UnliftingError
forall r. AsUnliftingError r => Prism' r UnliftingError
_UnliftingError UnliftingError
"Error catching is not supported" Maybe cause
mayCause
{-# INLINE readKnown #-}
instance KnownTypeIn uni val a => KnownTypeIn uni val (Emitter a) where
makeKnown :: (Text -> m ()) -> Maybe cause -> Emitter a -> m val
makeKnown Text -> m ()
emit Maybe cause
mayCause (Emitter forall (m :: * -> *). Monad m => (Text -> m ()) -> m a
k) = (Text -> m ()) -> m a
forall (m :: * -> *). Monad m => (Text -> m ()) -> m a
k Text -> m ()
emit m a -> (a -> m val) -> m val
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> m ()) -> Maybe cause -> a -> m val
forall (uni :: * -> *) val a err cause (m :: * -> *).
(KnownTypeIn uni val a, MonadError (ErrorWithCause err cause) m,
AsEvaluationFailure err) =>
(Text -> m ()) -> Maybe cause -> a -> m val
makeKnown Text -> m ()
emit Maybe cause
mayCause
{-# INLINE makeKnown #-}
readKnown :: Maybe cause -> val -> Either (ErrorWithCause err cause) (Emitter a)
readKnown Maybe cause
mayCause val
_ = AReview err UnliftingError
-> UnliftingError
-> Maybe cause
-> Either (ErrorWithCause err cause) (Emitter a)
forall exc e t term (m :: * -> *) x.
(exc ~ ErrorWithCause e term, MonadError exc m) =>
AReview e t -> t -> Maybe term -> m x
throwingWithCause AReview err UnliftingError
forall r. AsUnliftingError r => Prism' r UnliftingError
_UnliftingError UnliftingError
"Can't unlift an 'Emitter'" Maybe cause
mayCause
{-# INLINE readKnown #-}
instance HasConstantIn uni val => KnownTypeIn uni val (SomeConstant uni rep) where
makeKnown :: (Text -> m ()) -> Maybe cause -> SomeConstant uni rep -> m val
makeKnown Text -> m ()
_ Maybe cause
_ = (Some (ValueOf uni) -> m val) -> SomeConstant uni rep -> m val
forall a b r. Coercible a b => (a -> r) -> b -> r
coerceArg ((Some (ValueOf uni) -> m val) -> SomeConstant uni rep -> m val)
-> (Some (ValueOf uni) -> m val) -> SomeConstant uni rep -> m val
forall a b. (a -> b) -> a -> b
$ val -> m val
forall (f :: * -> *) a. Applicative f => a -> f a
pure (val -> m val)
-> (Some (ValueOf uni) -> val) -> Some (ValueOf uni) -> m val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Some (ValueOf uni) -> val
forall term.
FromConstant term =>
Some (ValueOf (UniOf term)) -> term
fromConstant
{-# INLINE makeKnown #-}
readKnown :: Maybe cause
-> val -> Either (ErrorWithCause err cause) (SomeConstant uni rep)
readKnown = ((Maybe cause
-> val -> Either (ErrorWithCause err cause) (Some (ValueOf uni)))
-> Maybe cause
-> val
-> Either (ErrorWithCause err cause) (SomeConstant uni rep))
-> (Maybe cause
-> val -> Either (ErrorWithCause err cause) (Some (ValueOf uni)))
-> Maybe cause
-> val
-> Either (ErrorWithCause err cause) (SomeConstant uni rep)
forall a b. Coercible a b => (a -> b) -> a -> b
coerceVia (\Maybe cause
-> val -> Either (ErrorWithCause err cause) (Some (ValueOf uni))
asC Maybe cause
mayCause -> (Some (ValueOf uni) -> SomeConstant uni rep)
-> Either (ErrorWithCause err cause) (Some (ValueOf uni))
-> Either (ErrorWithCause err cause) (SomeConstant uni rep)
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 (ErrorWithCause err cause) (Some (ValueOf uni))
-> Either (ErrorWithCause err cause) (SomeConstant uni rep))
-> (val -> Either (ErrorWithCause err cause) (Some (ValueOf uni)))
-> val
-> Either (ErrorWithCause err cause) (SomeConstant uni rep)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe cause
-> val -> Either (ErrorWithCause err cause) (Some (ValueOf uni))
asC Maybe cause
mayCause) Maybe cause
-> val -> Either (ErrorWithCause err cause) (Some (ValueOf uni))
forall term err cause (m :: * -> *).
(AsConstant term, MonadError (ErrorWithCause err cause) m,
AsUnliftingError err) =>
Maybe cause -> term -> m (Some (ValueOf (UniOf term)))
asConstant
{-# INLINE readKnown #-}
instance uni ~ UniOf val => KnownTypeIn uni val (Opaque val rep) where
makeKnown :: (Text -> m ()) -> Maybe cause -> Opaque val rep -> m val
makeKnown Text -> m ()
_ Maybe cause
_ = (val -> m val) -> Opaque val rep -> m val
forall a b r. Coercible a b => (a -> r) -> b -> r
coerceArg val -> m val
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE makeKnown #-}
readKnown :: Maybe cause
-> val -> Either (ErrorWithCause err cause) (Opaque val rep)
readKnown Maybe cause
_ = (Opaque val rep
-> Either (ErrorWithCause err cause) (Opaque val rep))
-> val -> Either (ErrorWithCause err cause) (Opaque val rep)
forall a b r. Coercible a b => (a -> r) -> b -> r
coerceArg Opaque val rep
-> Either (ErrorWithCause err cause) (Opaque val rep)
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE readKnown #-}
coerceVia :: Coercible a b => (a -> b) -> a -> b
coerceVia :: (a -> b) -> a -> b
coerceVia a -> b
_ = a -> b
coerce
{-# INLINE coerceVia #-}
coerceArg :: Coercible a b => (a -> r) -> b -> r
coerceArg :: (a -> r) -> b -> r
coerceArg = (a -> r) -> b -> r
coerce
{-# INLINE coerceArg #-}