20
20
{-# LANGUAGE PolyKinds #-}
21
21
{-# LANGUAGE RankNTypes #-}
22
22
{-# LANGUAGE StandaloneKindSignatures #-}
23
+ {-# LANGUAGE TupleSections #-}
23
24
{-# LANGUAGE TypeApplications #-}
24
25
{-# LANGUAGE TypeFamilies #-}
25
26
{-# LANGUAGE TypeOperators #-}
@@ -43,6 +44,7 @@ module PlutusCore.Default.Universe
43
44
import PlutusCore.Builtin
44
45
import PlutusPrelude
45
46
47
+ import PlutusCore.Core.Type (UniOf )
46
48
import PlutusCore.Crypto.BLS12_381.G1 qualified as BLS12_381.G1
47
49
import PlutusCore.Crypto.BLS12_381.G2 qualified as BLS12_381.G2
48
50
import PlutusCore.Crypto.BLS12_381.Pairing qualified as BLS12_381.Pairing
@@ -59,7 +61,8 @@ import Data.Proxy (Proxy (Proxy))
59
61
import Data.Text (Text )
60
62
import Data.Text qualified as Text
61
63
import Data.Typeable (typeRep )
62
- import Data.Vector.Strict (Vector )
64
+ import Data.Vector qualified as Vector
65
+ import Data.Vector.Strict qualified as Strict (Vector )
63
66
import Data.Word (Word16 , Word32 , Word64 )
64
67
import GHC.Exts (inline , oneShot )
65
68
import Text.PrettyBy.Fixity (RenderContext , inContextM , juxtPrettyM )
@@ -107,7 +110,7 @@ data DefaultUni a where
107
110
DefaultUniString :: DefaultUni (Esc Text )
108
111
DefaultUniUnit :: DefaultUni (Esc () )
109
112
DefaultUniBool :: DefaultUni (Esc Bool )
110
- DefaultUniProtoArray :: DefaultUni (Esc Vector )
113
+ DefaultUniProtoArray :: DefaultUni (Esc Strict. Vector )
111
114
DefaultUniProtoList :: DefaultUni (Esc [] )
112
115
DefaultUniProtoPair :: DefaultUni (Esc (,))
113
116
DefaultUniApply :: ! (DefaultUni (Esc f )) -> ! (DefaultUni (Esc a )) -> DefaultUni (Esc (f a ))
@@ -262,7 +265,7 @@ instance DefaultUni `Contains` Bool where
262
265
knownUni = DefaultUniBool
263
266
instance DefaultUni `Contains ` [] where
264
267
knownUni = DefaultUniProtoList
265
- instance DefaultUni `Contains ` Vector where
268
+ instance DefaultUni `Contains ` Strict. Vector where
266
269
knownUni = DefaultUniProtoArray
267
270
instance DefaultUni `Contains ` (,) where
268
271
knownUni = DefaultUniProtoPair
@@ -287,8 +290,8 @@ instance KnownBuiltinTypeAst tyname DefaultUni Bool =>
287
290
KnownTypeAst tyname DefaultUni Bool
288
291
instance KnownBuiltinTypeAst tyname DefaultUni [a ] =>
289
292
KnownTypeAst tyname DefaultUni [a ]
290
- instance KnownBuiltinTypeAst tyname DefaultUni (Vector a ) =>
291
- KnownTypeAst tyname DefaultUni (Vector a )
293
+ instance KnownBuiltinTypeAst tyname DefaultUni (Strict. Vector a ) =>
294
+ KnownTypeAst tyname DefaultUni (Strict. Vector a )
292
295
instance KnownBuiltinTypeAst tyname DefaultUni (a , b ) =>
293
296
KnownTypeAst tyname DefaultUni (a , b )
294
297
instance KnownBuiltinTypeAst tyname DefaultUni Data =>
@@ -314,8 +317,8 @@ instance KnownBuiltinTypeIn DefaultUni term Data =>
314
317
ReadKnownIn DefaultUni term Data
315
318
instance KnownBuiltinTypeIn DefaultUni term [a ] =>
316
319
ReadKnownIn DefaultUni term [a ]
317
- instance KnownBuiltinTypeIn DefaultUni term (Vector a ) =>
318
- ReadKnownIn DefaultUni term (Vector a )
320
+ instance KnownBuiltinTypeIn DefaultUni term (Strict. Vector a ) =>
321
+ ReadKnownIn DefaultUni term (Strict. Vector a )
319
322
instance KnownBuiltinTypeIn DefaultUni term (a , b ) =>
320
323
ReadKnownIn DefaultUni term (a , b )
321
324
instance KnownBuiltinTypeIn DefaultUni term BLS12_381.G1. Element =>
@@ -339,8 +342,8 @@ instance KnownBuiltinTypeIn DefaultUni term Data =>
339
342
MakeKnownIn DefaultUni term Data
340
343
instance KnownBuiltinTypeIn DefaultUni term [a ] =>
341
344
MakeKnownIn DefaultUni term [a ]
342
- instance KnownBuiltinTypeIn DefaultUni term (Vector a ) =>
343
- MakeKnownIn DefaultUni term (Vector a )
345
+ instance KnownBuiltinTypeIn DefaultUni term (Strict. Vector a ) =>
346
+ MakeKnownIn DefaultUni term (Strict. Vector a )
344
347
instance KnownBuiltinTypeIn DefaultUni term (a , b ) =>
345
348
MakeKnownIn DefaultUni term (a , b )
346
349
instance KnownBuiltinTypeIn DefaultUni term BLS12_381.G1. Element =>
@@ -508,9 +511,9 @@ deriving newtype instance KnownBuiltinTypeIn DefaultUni term [a] =>
508
511
509
512
deriving newtype instance KnownTypeAst tyname DefaultUni a =>
510
513
KnownTypeAst tyname DefaultUni (ArrayCostedByLength a )
511
- deriving newtype instance KnownBuiltinTypeIn DefaultUni term (Vector a ) =>
514
+ deriving newtype instance KnownBuiltinTypeIn DefaultUni term (Strict. Vector a ) =>
512
515
MakeKnownIn DefaultUni term (ArrayCostedByLength a )
513
- deriving newtype instance KnownBuiltinTypeIn DefaultUni term (Vector a ) =>
516
+ deriving newtype instance KnownBuiltinTypeIn DefaultUni term (Strict. Vector a ) =>
514
517
ReadKnownIn DefaultUni term (ArrayCostedByLength a )
515
518
516
519
deriving via AsInteger Natural instance
@@ -533,6 +536,23 @@ instance KnownBuiltinTypeIn DefaultUni term Integer => ReadKnownIn DefaultUni te
533
536
]
534
537
{-# INLINE readKnown #-}
535
538
539
+ instance UniOf term ~ DefaultUni => CaseBuiltin term DefaultUni where
540
+ caseBuiltin (Some (ValueOf uni x)) branches = case uni of
541
+ DefaultUniBool
542
+ | Vector. length branches == 2 -> Right $ branches Vector. ! fromEnum (not x)
543
+ | otherwise -> Left ()
544
+ DefaultUniInteger
545
+ | x < fromIntegral (Vector. length branches) -> Right $ branches Vector. ! fromIntegral x
546
+ | otherwise -> Left ()
547
+ _ -> Left ()
548
+
549
+
550
+ instance AnnotateCaseBuiltin DefaultUni where
551
+ annotateCaseBuiltin (SomeTypeIn uni) branches = case uni of
552
+ DefaultUniBool -> Right $ map (, [] ) branches
553
+ DefaultUniInteger -> Right $ map (, [] ) branches
554
+ _ -> Left ()
555
+
536
556
{- Note [Stable encoding of tags]
537
557
'encodeUni' and 'decodeUni' are used for serialisation and deserialisation of types from the
538
558
universe and we need serialised things to be extremely stable, hence the definitions of 'encodeUni'
@@ -549,7 +569,7 @@ instance Closed DefaultUni where
549
569
, constr `Permits ` ()
550
570
, constr `Permits ` Bool
551
571
, constr `Permits ` []
552
- , constr `Permits ` Vector
572
+ , constr `Permits ` Strict. Vector
553
573
, constr `Permits ` (,)
554
574
, constr `Permits ` Data
555
575
, constr `Permits ` BLS12_381.G1. Element
0 commit comments