1
1
use aiken/builtin
2
- use cardano/assets.{Value}
3
- use aiken/interval.{Interval}
4
- use cardano/script_context.{ScriptContext}
5
- use cardano/transaction.{Input, Output, ScriptPurpose, Transaction}
6
- use aiken/crypto.{Blake2b_224, Hash}
7
- use cardano/address.{Address, Credential, Inline, VerificationKey}
8
2
use aiken/collection/dict
3
+ use aiken/crypto
9
4
10
5
/// A growth pattern determines how complexity scales with input size
11
6
pub type Growth {
@@ -24,25 +19,28 @@ fn rand(prng: PRNG) -> Option<(PRNG, Int)> {
24
19
when prng is {
25
20
Seeded { seed, choices } -> {
26
21
let choice = builtin.index_bytearray(seed, 0)
27
- Some((
28
- Seeded {
29
- seed: crypto.blake2b_256(seed),
30
- choices: builtin.cons_bytearray(choice, choices),
31
- },
32
- choice,
33
- ))
22
+ Some(
23
+ (
24
+ Seeded {
25
+ seed: crypto.blake2b_256(seed),
26
+ choices: builtin.cons_bytearray(choice, choices),
27
+ },
28
+ choice,
29
+ ),
30
+ )
34
31
}
35
- Replayed { cursor, choices } -> {
32
+ Replayed { cursor, choices } ->
36
33
if cursor >= 1 {
37
34
let cursor = cursor - 1
38
- Some((
39
- Replayed { cursor, choices },
40
- builtin.index_bytearray(choices, cursor),
41
- ))
35
+ Some(
36
+ (
37
+ Replayed { cursor, choices },
38
+ builtin.index_bytearray(choices, cursor),
39
+ ),
40
+ )
42
41
} else {
43
42
None
44
43
}
45
- }
46
44
}
47
45
}
48
46
@@ -51,7 +49,7 @@ pub fn apply_growth(pattern: Growth, n: Int) -> Int {
51
49
when pattern is {
52
50
Constant -> 1
53
51
Linear(base) -> base * n
54
- Exponential(base) ->
52
+ Exponential(base) ->
55
53
if n <= 0 {
56
54
0
57
55
} else {
@@ -68,11 +66,11 @@ pub fn apply_growth(pattern: Growth, n: Int) -> Int {
68
66
69
67
// TODO: Probably need to use a builtin in the future.
70
68
fn exp_int_helper(base: Int, n: Int, acc: Int) -> Int {
71
- if base <= 0 {
72
- acc
73
- } else {
74
- exp_int_helper(base - 1, n, acc * n)
75
- }
69
+ if base <= 0 {
70
+ acc
71
+ } else {
72
+ exp_int_helper(base - 1, n, acc * n)
73
+ }
76
74
}
77
75
78
76
// TODO: Probably need to use a builtin in the future.
@@ -110,22 +108,32 @@ pub fn bytestring(growth: Growth) -> Sampler<ByteArray> {
110
108
let length_fuzzer = int(growth)(n)
111
109
fn(prng) {
112
110
when length_fuzzer(prng) is {
113
- Some((prng2, len)) -> {
114
- todo
115
- }
111
+ Some((_prng2, _len)) -> todo
116
112
None -> None
117
113
}
118
114
}
119
115
}
120
116
}
121
117
122
- fn list_handler(items_so_far: List<a>, i: Int, scaled_length: Int, fuzzer: Fuzzer<a>, prng: PRNG) -> Option<(PRNG, List<a>)> {
118
+ fn list_handler(
119
+ items_so_far: List<a>,
120
+ i: Int,
121
+ scaled_length: Int,
122
+ fuzzer: Fuzzer<a>,
123
+ prng: PRNG,
124
+ ) -> Option<(PRNG, List<a>)> {
123
125
if i > scaled_length {
124
126
Some((prng, items_so_far))
125
127
} else {
126
128
when fuzzer(prng) is {
127
- Some((new_prng, item)) ->
128
- list_handler([item, ..items_so_far], i + 1, scaled_length, fuzzer, new_prng)
129
+ Some((new_prng, item)) ->
130
+ list_handler(
131
+ [item, ..items_so_far],
132
+ i + 1,
133
+ scaled_length,
134
+ fuzzer,
135
+ new_prng,
136
+ )
129
137
None -> None
130
138
}
131
139
}
@@ -136,49 +144,56 @@ pub fn list(element_sampler: Sampler<a>, growth: Growth) -> Sampler<List<a>> {
136
144
fn(n) {
137
145
let scaled_length = apply_growth(growth, n)
138
146
let element_fuzzer = element_sampler(n)
139
- fn(prng) {
140
- list_handler([], 0, scaled_length, element_fuzzer, prng)
141
- }
147
+ fn(prng) { list_handler([], 0, scaled_length, element_fuzzer, prng) }
142
148
}
143
149
}
144
150
145
- pub fn pair(first_sampler: Sampler<a>, second_sampler: Sampler<b>) -> Sampler<Pair<a, b>> {
146
- fn(n) {
147
- let first_fuzzer = first_sampler(n)
148
- let second_fuzzer = second_sampler(n)
149
- fn(prng) {
150
- when first_fuzzer(prng) is {
151
- Some((prng2, first_val)) -> {
152
- when second_fuzzer(prng2) is {
153
- Some((prng3, second_val)) ->
154
- Some((prng3, Pair(first_val, second_val)))
155
- None -> None
156
- }
157
- }
158
- None -> None
159
- }
160
- }
151
+ pub fn pair(
152
+ first_sampler: Sampler<a>,
153
+ second_sampler: Sampler<b>,
154
+ ) -> Sampler<Pair<a, b>> {
155
+ fn(n) {
156
+ let first_fuzzer = first_sampler(n)
157
+ let second_fuzzer = second_sampler(n)
158
+ fn(prng) {
159
+ when first_fuzzer(prng) is {
160
+ Some((prng2, first_val)) ->
161
+ when second_fuzzer(prng2) is {
162
+ Some((prng3, second_val)) ->
163
+ Some((prng3, Pair(first_val, second_val)))
164
+ None -> None
165
+ }
166
+ None -> None
167
+ }
161
168
}
169
+ }
162
170
}
163
171
164
- pub fn pairs(first_sampler: Sampler<a>, second_sampler: Sampler<b>, growth: Growth) {
165
- fn (n) {
166
- let scaled_length = apply_growth(growth, n)
167
- let pair_sampler = pair(first_sampler, second_sampler)(n)
172
+ pub fn pairs(
173
+ first_sampler: Sampler<a>,
174
+ second_sampler: Sampler<b>,
175
+ growth: Growth,
176
+ ) {
177
+ fn(n) {
178
+ let scaled_length = apply_growth(growth, n)
179
+ let pair_sampler = pair(first_sampler, second_sampler)(n)
168
180
169
- fn(prng) {
170
- list_handler([], 0, scaled_length, pair_sampler, prng)
171
- }
172
- }
181
+ fn(prng) { list_handler([], 0, scaled_length, pair_sampler, prng) }
182
+ }
173
183
}
174
184
175
- pub fn dict(key_sampler: Sampler<ByteArray>, value_sampler: Sampler<a>, growth: Growth) {
176
- fn (n) {
177
- let scaled_length = apply_growth(growth, n)
178
- map(pairs(key_sampler, value_sampler, growth), fn(pairs) {
179
- dict.from_pairs(pairs)
180
- })
181
- }
185
+ pub fn dict(
186
+ key_sampler: Sampler<ByteArray>,
187
+ value_sampler: Sampler<a>,
188
+ growth: Growth,
189
+ ) {
190
+ fn(n) {
191
+ let _scaled_length = apply_growth(growth, n)
192
+ map(
193
+ pairs(key_sampler, value_sampler, growth),
194
+ fn(pairs) { dict.from_pairs(pairs) },
195
+ )
196
+ }
182
197
}
183
198
184
199
pub fn map(sampler: Sampler<a>, f: fn(a) -> b) -> Sampler<b> {
@@ -193,20 +208,23 @@ pub fn map(sampler: Sampler<a>, f: fn(a) -> b) -> Sampler<b> {
193
208
}
194
209
}
195
210
196
- pub fn map2(sampler: Sampler<a>, sampler2: Sampler<b>, f: fn(a, b) -> c) -> Sampler<c> {
197
- fn(n) {
198
- let fuzzer1 = sampler(n)
199
- let fuzzer2 = sampler2(n)
200
- fn(prng) {
201
- when fuzzer1(prng) is {
202
- Some((prng2, a)) -> {
203
- when fuzzer2(prng2) is {
204
- Some((prng3, b)) -> Some((prng3, f(a, b)))
205
- None -> None
206
- }
207
- }
208
- None -> None
209
- }
210
- }
211
+ pub fn map2(
212
+ sampler: Sampler<a>,
213
+ sampler2: Sampler<b>,
214
+ f: fn(a, b) -> c,
215
+ ) -> Sampler<c> {
216
+ fn(n) {
217
+ let fuzzer1 = sampler(n)
218
+ let fuzzer2 = sampler2(n)
219
+ fn(prng) {
220
+ when fuzzer1(prng) is {
221
+ Some((prng2, a)) ->
222
+ when fuzzer2(prng2) is {
223
+ Some((prng3, b)) -> Some((prng3, f(a, b)))
224
+ None -> None
225
+ }
226
+ None -> None
227
+ }
211
228
}
212
- }
229
+ }
230
+ }
0 commit comments