Add Fuzzer to the prelude.

This commit is contained in:
KtorZ 2024-03-01 17:02:49 +01:00
parent 5b4fedd084
commit 93347d8e7b
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
3 changed files with 26 additions and 5 deletions

View File

@ -29,7 +29,7 @@ pub const OPTION: &str = "Option";
pub const ORDERING: &str = "Ordering"; pub const ORDERING: &str = "Ordering";
pub const REDEEMER_WRAPPER: &str = "RedeemerWrapper"; pub const REDEEMER_WRAPPER: &str = "RedeemerWrapper";
pub const PRNG: &str = "PRNG"; pub const PRNG: &str = "PRNG";
pub const FUZZER: &str = "FUZZER"; pub const FUZZER: &str = "Fuzzer";
/// Build a prelude that can be injected /// Build a prelude that can be injected
/// into a compiler pipeline /// into a compiler pipeline
@ -482,6 +482,23 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo {
), ),
); );
// Fuzzer
//
// pub type Fuzzer<a> =
// fn(PRNG) -> Option<(PRNG, a)>
let fuzzer_value = generic_var(id_gen.next());
prelude.types.insert(
FUZZER.to_string(),
TypeConstructor {
location: Span::empty(),
parameters: vec![fuzzer_value.clone()],
tipo: fuzzer(fuzzer_value),
module: "".to_string(),
public: true,
},
);
prelude prelude
} }
@ -1302,6 +1319,13 @@ pub fn prng() -> Rc<Type> {
}) })
} }
pub fn fuzzer(a: Rc<Type>) -> Rc<Type> {
Rc::new(Type::Fn {
args: vec![prng()],
ret: option(tuple(vec![prng(), a])),
})
}
pub fn list(t: Rc<Type>) -> Rc<Type> { pub fn list(t: Rc<Type>) -> Rc<Type> {
Rc::new(Type::App { Rc::new(Type::App {
public: true, public: true,

View File

@ -2,9 +2,6 @@ use aiken/builtin
const max_int: Int = 255 const max_int: Int = 255
pub type Fuzzer<a> =
fn(PRNG) -> Option<(PRNG, a)>
// Primitives // Primitives
pub fn any_int() -> Fuzzer<Int> { pub fn any_int() -> Fuzzer<Int> {

View File

@ -1,5 +1,5 @@
use aiken/dict.{Dict} use aiken/dict.{Dict}
use aiken/fuzz.{Fuzzer} use aiken/fuzz
use aiken/int use aiken/int
pub type Season { pub type Season {