diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index 2a1ee85d..feae3278 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -22,6 +22,7 @@ pub const VOID: &str = "Void"; pub const RESULT: &str = "Result"; pub const STRING: &str = "String"; pub const OPTION: &str = "Option"; +pub const ORDERING: &str = "Ordering"; /// Build a prelude that can be injected /// into a compiler pipeline @@ -119,6 +120,72 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo { }, ); + // Ordering + prelude.types_constructors.insert( + ORDERING.to_string(), + vec![ + "Less".to_string(), + "Equal".to_string(), + "Greater".to_string(), + ], + ); + + prelude.values.insert( + "Less".to_string(), + ValueConstructor::public( + ordering(), + ValueConstructorVariant::Record { + module: "".into(), + name: "Less".to_string(), + field_map: None::, + arity: 0, + location: Span::empty(), + constructors_count: 3, + }, + ), + ); + + prelude.values.insert( + "Equal".to_string(), + ValueConstructor::public( + ordering(), + ValueConstructorVariant::Record { + module: "".into(), + name: "Equal".to_string(), + field_map: None::, + arity: 0, + location: Span::empty(), + constructors_count: 3, + }, + ), + ); + + prelude.values.insert( + "Greater".to_string(), + ValueConstructor::public( + ordering(), + ValueConstructorVariant::Record { + module: "".into(), + name: "Greater".to_string(), + field_map: None::, + arity: 0, + location: Span::empty(), + constructors_count: 3, + }, + ), + ); + + prelude.types.insert( + ORDERING.to_string(), + TypeConstructor { + location: Span::empty(), + parameters: vec![], + tipo: ordering(), + module: "".to_string(), + public: true, + }, + ); + // not prelude.values.insert( "not".to_string(), @@ -908,6 +975,15 @@ pub fn option(a: Arc) -> Arc { }) } +pub fn ordering() -> Arc { + Arc::new(Type::App { + public: true, + name: ORDERING.to_string(), + module: "".to_string(), + args: vec![], + }) +} + pub fn function(args: Vec>, ret: Arc) -> Arc { Arc::new(Type::Fn { ret, args }) } diff --git a/crates/aiken-project/src/blueprint/schema.rs b/crates/aiken-project/src/blueprint/schema.rs index 6e42fd59..edf5402c 100644 --- a/crates/aiken-project/src/blueprint/schema.rs +++ b/crates/aiken-project/src/blueprint/schema.rs @@ -127,6 +127,37 @@ impl Annotated { ]))), }), + "Ordering" => Ok(Annotated { + title: Some("Ordering".to_string()), + description: None, + annotated: Schema::Data(Some(Data::AnyOf(vec![ + Annotated { + title: Some("Less".to_string()), + description: None, + annotated: Constructor { + index: 0, + fields: vec![], + }, + }, + Annotated { + title: Some("Equal".to_string()), + description: None, + annotated: Constructor { + index: 1, + fields: vec![], + }, + }, + Annotated { + title: Some("Greater".to_string()), + description: None, + annotated: Constructor { + index: 2, + fields: vec![], + }, + }, + ]))), + }), + "Option" => { let generic = Annotated::from_type(modules, args.get(0).unwrap(), type_parameters)