Skip to content

Commit

Permalink
Fix "un-rolling" a list type. (#6165)
Browse files Browse the repository at this point in the history
* Fix "un-rolling" a list type.

* Un-roll other general types: [], Maybe, (,), BuiltinUnit, BuiltinPair
  • Loading branch information
Unisay authored Jun 28, 2024
1 parent e3c3fd2 commit d0d77dc
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 4 deletions.
10 changes: 7 additions & 3 deletions plutus-tx/src/PlutusTx/Blueprint/Definition/Unroll.hs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import GHC.TypeLits qualified as GHC
import PlutusTx.Blueprint.Class (HasSchema)
import PlutusTx.Blueprint.Definition.Id as DefinitionId (AsDefinitionId (..))
import PlutusTx.Blueprint.Definition.Internal (Definitions (..), addDefinition, definition)
import PlutusTx.Builtins.Internal (BuiltinByteString, BuiltinData, BuiltinList, BuiltinString,
BuiltinUnit)
import PlutusTx.Builtins.Internal (BuiltinByteString, BuiltinData, BuiltinList, BuiltinPair,
BuiltinString, BuiltinUnit)

----------------------------------------------------------------------------------------------------
-- Functionality to "unroll" types. -- For more context see Note ["Unrolling" types] -----------
Expand Down Expand Up @@ -89,8 +89,12 @@ type family Unroll (p :: Type) :: [Type] where
Unroll BuiltinData = '[BuiltinData]
Unroll BuiltinUnit = '[BuiltinUnit]
Unroll BuiltinString = '[BuiltinString]
Unroll (BuiltinList a) = Prepend (BuiltinList a) (GUnroll (Rep a))
Unroll (BuiltinList a) = Unroll a
Unroll (BuiltinPair a b) = Unroll a ++ Unroll b
Unroll BuiltinByteString = '[BuiltinByteString]
Unroll [a] = Unroll a
Unroll (a, b) = Unroll a ++ Unroll b
Unroll (Maybe a) = Unroll a
Unroll p = Prepend p (GUnroll (Break (NoGeneric p) (Rep p)))

-- | Detect stuck type family: https://blog.csongor.co.uk/report-stuck-families/#custom-type-errors
Expand Down
24 changes: 23 additions & 1 deletion plutus-tx/test/Blueprint/Spec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import PlutusTx.Blueprint.Definition (AsDefinitionId, Definitions, Unroll, Unrol
Unrollable (..))
import PlutusTx.Blueprint.Schema (Schema (..))
import PlutusTx.Blueprint.Schema.Annotation (emptySchemaInfo)
import PlutusTx.Builtins (BuiltinData)
import PlutusTx.Builtins.Internal (BuiltinData, BuiltinList, BuiltinPair, BuiltinUnit)
import PlutusTx.IsData ()

----------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -74,6 +74,9 @@ testUnrollNop = Refl
testUnrollBaz :: Unroll Baz :~: [Baz, Integer]
testUnrollBaz = Refl

testUnrollListBaz :: Unroll [Baz] :~: [Baz, Integer]
testUnrollListBaz = Refl

testUnrollZap :: Unroll Zap :~: [Zap, Nop, Integer, Bool]
testUnrollZap = Refl

Expand All @@ -91,3 +94,22 @@ definitions = unroll @(UnrollAll '[Foo])

testUnrollDat :: Unroll Dat :~: '[Dat, BuiltinData]
testUnrollDat = Refl

testUnrollList :: Unroll [Bool] :~: '[Bool]
testUnrollList = Refl

testUnrollNestedLists :: Unroll [[[Bool]]] :~: '[Bool]
testUnrollNestedLists = Refl

testUnrollPair :: Unroll (Integer, Bool) :~: '[Bool, Integer]
testUnrollPair = Refl

testUnrollBuiltinPair :: Unroll (BuiltinPair Integer Bool) :~: '[Bool, Integer]
testUnrollBuiltinPair = Refl

testUnrollBuiltinList
:: Unroll (BuiltinList (BuiltinPair Bool BuiltinUnit)) :~: '[BuiltinUnit, Bool]
testUnrollBuiltinList = Refl

testUnrollMaybe :: Unroll (Maybe Bool) :~: '[Bool]
testUnrollMaybe = Refl

0 comments on commit d0d77dc

Please sign in to comment.