From cbf3ef28543f1342527fc62f5d282938ad598ee1 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Wed, 3 Apr 2024 11:23:08 +0200 Subject: [PATCH] Add new Prelude alias: 'Map' --- crates/aiken-lang/src/builtins.rs | 54 +++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index b5256b41..37a4f05b 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -20,6 +20,7 @@ pub const BOOL: &str = "Bool"; pub const INT: &str = "Int"; pub const DATA: &str = "Data"; pub const LIST: &str = "List"; +pub const MAP: &str = "Map"; pub const PAIR: &str = "Pair"; pub const VOID: &str = "Void"; pub const G1_ELEMENT: &str = "G1Element"; @@ -494,7 +495,6 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo { // Seeded { seed: ByteArray, choices: ByteArray } // Replayed { cursor: Int, choices: ByteArray } // } - prelude.types.insert( PRNG.to_string(), TypeConstructor { @@ -559,7 +559,6 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo { // // pub type Fuzzer = // fn(PRNG) -> Option<(PRNG, a)> - let fuzzer_value = generic_var(id_gen.next()); prelude.types.insert( FUZZER.to_string(), @@ -572,6 +571,22 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo { }, ); + // Map + // + // pub type Map = List> + let map_key = generic_var(id_gen.next()); + let map_value = generic_var(id_gen.next()); + prelude.types.insert( + MAP.to_string(), + TypeConstructor { + location: Span::empty(), + parameters: vec![map_key.clone(), map_value.clone()], + tipo: map(map_key, map_value), + module: "".to_string(), + public: true, + }, + ); + prelude } @@ -1477,9 +1492,43 @@ pub fn fuzzer(a: Rc) -> Rc { }) } +pub fn map(k: Rc, v: Rc) -> Rc { + Rc::new(Type::App { + public: true, + contains_opaque: false, + module: "".to_string(), + name: LIST.to_string(), + args: vec![pair(k, v)], + alias: Some( + TypeAliasAnnotation { + alias: MAP.to_string(), + parameters: vec!["k".to_string(), "v".to_string()], + annotation: Annotation::Constructor { + location: Span::empty(), + module: None, + name: LIST.to_string(), + arguments: vec![Annotation::Pair { + location: Span::empty(), + fst: Box::new(Annotation::Var { + location: Span::empty(), + name: "k".to_string(), + }), + snd: Box::new(Annotation::Var { + location: Span::empty(), + name: "v".to_string(), + }), + }], + }, + } + .into(), + ), + }) +} + pub fn list(t: Rc) -> Rc { Rc::new(Type::App { public: true, + // FIXME: We should probably have t.contains_opaque here? contains_opaque: false, name: LIST.to_string(), module: "".to_string(), @@ -1513,6 +1562,7 @@ pub fn void() -> Rc { pub fn option(a: Rc) -> Rc { Rc::new(Type::App { public: true, + // FIXME: We should probably have t.contains_opaque here? contains_opaque: false, name: OPTION.to_string(), module: "".to_string(),