Skip to content

Commit 54249f0

Browse files
committed
Implement deriveEnumData
1 parent 85ce1fd commit 54249f0

File tree

13 files changed

+848
-23
lines changed

13 files changed

+848
-23
lines changed

plutus-tx-plugin/plutus-tx-plugin.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ test-suite plutus-tx-plugin-tests
115115
hs-source-dirs: test
116116
main-is: Spec.hs
117117
other-modules:
118+
Enum.Spec
118119
Array.Spec
119120
AsData.Budget.Spec
120121
AsData.Budget.Types
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
constr 0 [(constr 0 [])]
Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
let
2+
~unsafeFromBuiltinData : all a. (\a -> data -> a) a -> data -> a
3+
= /\a -> \(v : (\a -> data -> a) a) -> v
4+
in
5+
let
6+
!unsafeDataAsMap : data -> list (pair data data) = unMapData
7+
in
8+
let
9+
!unsafeDataAsList : data -> list data = unListData
10+
in
11+
let
12+
!unsafeDataAsI : data -> integer = unIData
13+
in
14+
let
15+
!unsafeDataAsConstr : data -> pair integer (list data) = unConstrData
16+
in
17+
let
18+
!unsafeDataAsB : data -> bytestring = unBData
19+
in
20+
let
21+
!unitval : unit = ()
22+
in
23+
let
24+
~toBuiltinData : all a. (\a -> a -> data) a -> a -> data
25+
= /\a -> \(v : (\a -> a -> data) a) -> v
26+
in
27+
let
28+
!mkI : integer -> data = iData
29+
in
30+
letrec
31+
data (Maybe :: * -> *) a | Maybe_match where
32+
Just : a -> Maybe a
33+
Nothing : Maybe a
34+
in
35+
let
36+
~fromBuiltinData : all a. (\a -> data -> Maybe a) a -> data -> Maybe a
37+
= /\a -> \(v : (\a -> data -> Maybe a) a) -> v
38+
in
39+
let
40+
!error : all a. unit -> a = /\a -> \(thunk : unit) -> error {a}
41+
in
42+
let
43+
!equalsInteger : integer -> integer -> bool = equalsInteger
44+
in
45+
let
46+
!chooseData : all a. data -> a -> a -> a -> a -> a -> a = chooseData
47+
in
48+
let
49+
!casePair : all a b r. pair a b -> (a -> b -> r) -> r
50+
= /\a b r ->
51+
\(p : pair a b) (f : a -> b -> r) ->
52+
f (fstPair {a} {b} p) (sndPair {a} {b} p)
53+
in
54+
letrec
55+
data SomeVeryLargeEnum | SomeVeryLargeEnum_match where
56+
E10Ten : SomeVeryLargeEnum
57+
E1One : SomeVeryLargeEnum
58+
E2Two : SomeVeryLargeEnum
59+
E3Three : SomeVeryLargeEnum
60+
E4Four : SomeVeryLargeEnum
61+
E5Five : SomeVeryLargeEnum
62+
E6Six : SomeVeryLargeEnum
63+
E7Seven : SomeVeryLargeEnum
64+
E8Eight : SomeVeryLargeEnum
65+
E9Nine : SomeVeryLargeEnum
66+
in
67+
letrec
68+
data Unit | Unit_match where
69+
Unit : Unit
70+
in
71+
let
72+
~`$cunsafeFromBuiltinData` : data -> SomeVeryLargeEnum
73+
= \(input : data) ->
74+
let
75+
!input : data = input
76+
in
77+
let
78+
!decoded : integer = unsafeDataAsI input
79+
in
80+
ifThenElse
81+
{all dead. SomeVeryLargeEnum}
82+
(equalsInteger decoded 0)
83+
(/\dead -> E1One)
84+
(/\dead ->
85+
ifThenElse
86+
{all dead. SomeVeryLargeEnum}
87+
(equalsInteger decoded 1)
88+
(/\dead -> E2Two)
89+
(/\dead ->
90+
ifThenElse
91+
{all dead. SomeVeryLargeEnum}
92+
(equalsInteger decoded 2)
93+
(/\dead -> E3Three)
94+
(/\dead ->
95+
ifThenElse
96+
{all dead. SomeVeryLargeEnum}
97+
(equalsInteger decoded 3)
98+
(/\dead -> E4Four)
99+
(/\dead ->
100+
ifThenElse
101+
{all dead. SomeVeryLargeEnum}
102+
(equalsInteger decoded 4)
103+
(/\dead -> E5Five)
104+
(/\dead ->
105+
ifThenElse
106+
{all dead. SomeVeryLargeEnum}
107+
(equalsInteger decoded 5)
108+
(/\dead -> E6Six)
109+
(/\dead ->
110+
ifThenElse
111+
{all dead. SomeVeryLargeEnum}
112+
(equalsInteger decoded 6)
113+
(/\dead -> E7Seven)
114+
(/\dead ->
115+
ifThenElse
116+
{all dead. SomeVeryLargeEnum}
117+
(equalsInteger decoded 7)
118+
(/\dead -> E8Eight)
119+
(/\dead ->
120+
ifThenElse
121+
{all dead. SomeVeryLargeEnum}
122+
(equalsInteger decoded 8)
123+
(/\dead -> E9Nine)
124+
(/\dead ->
125+
ifThenElse
126+
{all dead.
127+
SomeVeryLargeEnum}
128+
(equalsInteger decoded 9)
129+
(/\dead -> E10Ten)
130+
(/\dead ->
131+
error
132+
{SomeVeryLargeEnum}
133+
unitval)
134+
{all dead. dead})
135+
{all dead. dead})
136+
{all dead. dead})
137+
{all dead. dead})
138+
{all dead. dead})
139+
{all dead. dead})
140+
{all dead. dead})
141+
{all dead. dead})
142+
{all dead. dead})
143+
{all dead. dead}
144+
in
145+
let
146+
~`$fUnsafeFromDataSomeVeryLargeEnum` : (\a -> data -> a) SomeVeryLargeEnum
147+
= `$cunsafeFromBuiltinData`
148+
in
149+
let
150+
~`$ctoBuiltinData` : SomeVeryLargeEnum -> data
151+
= \(ds : SomeVeryLargeEnum) ->
152+
SomeVeryLargeEnum_match
153+
ds
154+
{all dead. data}
155+
(/\dead -> mkI 9)
156+
(/\dead -> mkI 0)
157+
(/\dead -> mkI 1)
158+
(/\dead -> mkI 2)
159+
(/\dead -> mkI 3)
160+
(/\dead -> mkI 4)
161+
(/\dead -> mkI 5)
162+
(/\dead -> mkI 6)
163+
(/\dead -> mkI 7)
164+
(/\dead -> mkI 8)
165+
{all dead. dead}
166+
in
167+
let
168+
~`$fToDataSomeVeryLargeEnum` : (\a -> a -> data) SomeVeryLargeEnum
169+
= `$ctoBuiltinData`
170+
in
171+
let
172+
~`$cfromBuiltinData` :
173+
data -> Maybe SomeVeryLargeEnum
174+
= \(input : data) ->
175+
let
176+
!input : data = input
177+
in
178+
chooseData
179+
{Unit -> Maybe SomeVeryLargeEnum}
180+
input
181+
(\(ds : Unit) ->
182+
casePair
183+
{integer}
184+
{list data}
185+
{Maybe SomeVeryLargeEnum}
186+
(unsafeDataAsConstr input)
187+
(\(l : integer) (r : list data) -> Nothing {SomeVeryLargeEnum}))
188+
(\(ds : Unit) ->
189+
let
190+
!ds : list (pair data data) = unsafeDataAsMap input
191+
in
192+
Nothing {SomeVeryLargeEnum})
193+
(\(ds : Unit) ->
194+
let
195+
!ds : list data = unsafeDataAsList input
196+
in
197+
Nothing {SomeVeryLargeEnum})
198+
(\(ds : Unit) ->
199+
let
200+
!decoded : integer = unsafeDataAsI input
201+
in
202+
ifThenElse
203+
{all dead. Maybe SomeVeryLargeEnum}
204+
(equalsInteger decoded 0)
205+
(/\dead -> Just {SomeVeryLargeEnum} E1One)
206+
(/\dead ->
207+
ifThenElse
208+
{all dead. Maybe SomeVeryLargeEnum}
209+
(equalsInteger decoded 1)
210+
(/\dead -> Just {SomeVeryLargeEnum} E2Two)
211+
(/\dead ->
212+
ifThenElse
213+
{all dead. Maybe SomeVeryLargeEnum}
214+
(equalsInteger decoded 2)
215+
(/\dead -> Just {SomeVeryLargeEnum} E3Three)
216+
(/\dead ->
217+
ifThenElse
218+
{all dead. Maybe SomeVeryLargeEnum}
219+
(equalsInteger decoded 3)
220+
(/\dead -> Just {SomeVeryLargeEnum} E4Four)
221+
(/\dead ->
222+
ifThenElse
223+
{all dead. Maybe SomeVeryLargeEnum}
224+
(equalsInteger decoded 4)
225+
(/\dead -> Just {SomeVeryLargeEnum} E5Five)
226+
(/\dead ->
227+
ifThenElse
228+
{all dead. Maybe SomeVeryLargeEnum}
229+
(equalsInteger decoded 5)
230+
(/\dead ->
231+
Just {SomeVeryLargeEnum} E6Six)
232+
(/\dead ->
233+
ifThenElse
234+
{all dead. Maybe SomeVeryLargeEnum}
235+
(equalsInteger decoded 6)
236+
(/\dead ->
237+
Just
238+
{SomeVeryLargeEnum}
239+
E7Seven)
240+
(/\dead ->
241+
ifThenElse
242+
{all dead.
243+
Maybe SomeVeryLargeEnum}
244+
(equalsInteger decoded 7)
245+
(/\dead ->
246+
Just
247+
{SomeVeryLargeEnum}
248+
E8Eight)
249+
(/\dead ->
250+
ifThenElse
251+
{all dead.
252+
Maybe
253+
SomeVeryLargeEnum}
254+
(equalsInteger decoded 8)
255+
(/\dead ->
256+
Just
257+
{SomeVeryLargeEnum}
258+
E9Nine)
259+
(/\dead ->
260+
ifThenElse
261+
{all dead.
262+
Maybe
263+
SomeVeryLargeEnum}
264+
(equalsInteger
265+
decoded
266+
9)
267+
(/\dead ->
268+
Just
269+
{SomeVeryLargeEnum}
270+
E10Ten)
271+
(/\dead ->
272+
Nothing
273+
{SomeVeryLargeEnum})
274+
{all dead. dead})
275+
{all dead. dead})
276+
{all dead. dead})
277+
{all dead. dead})
278+
{all dead. dead})
279+
{all dead. dead})
280+
{all dead. dead})
281+
{all dead. dead})
282+
{all dead. dead})
283+
{all dead. dead})
284+
(\(ds : Unit) ->
285+
let
286+
!ds : bytestring = unsafeDataAsB input
287+
in
288+
Nothing {SomeVeryLargeEnum})
289+
Unit
290+
in
291+
let
292+
~`$fFromDataSomeVeryLargeEnum` : (\a -> data -> Maybe a) SomeVeryLargeEnum
293+
= `$cfromBuiltinData`
294+
in
295+
fromBuiltinData
296+
{SomeVeryLargeEnum}
297+
`$fFromDataSomeVeryLargeEnum`
298+
(toBuiltinData
299+
{SomeVeryLargeEnum}
300+
`$fToDataSomeVeryLargeEnum`
301+
(unsafeFromBuiltinData
302+
{SomeVeryLargeEnum}
303+
`$fUnsafeFromDataSomeVeryLargeEnum`
304+
(toBuiltinData {SomeVeryLargeEnum} `$fToDataSomeVeryLargeEnum` E10Ten)))

0 commit comments

Comments
 (0)