Skip to main content

generic_match/
generic_match.rs

1//! Probe whether pattern matching on a generic enum and nested
2//! generic structs work end to end.
3//!
4//! Run with: `cargo run --example generic_match`
5
6use keleusma::compiler::compile;
7use keleusma::lexer::tokenize;
8use keleusma::parser::parse;
9use keleusma::vm::{DEFAULT_ARENA_CAPACITY, Vm, VmState};
10use keleusma::{Arena, Value};
11
12fn run(label: &str, src: &str) -> Value {
13    let tokens = tokenize(src).expect("lex");
14    let program = parse(&tokens).expect("parse");
15    let module = compile(&program).expect("compile");
16    let arena = Arena::with_capacity(DEFAULT_ARENA_CAPACITY);
17    let mut vm = Vm::new(module, &arena).expect("verify");
18    match vm.call(&[]) {
19        Ok(VmState::Finished(v)) => {
20            println!("{}: {:?}", label, v);
21            v
22        }
23        other => panic!("{}: {:?}", label, other),
24    }
25}
26
27fn main() {
28    let r1 = run(
29        "pattern match on generic enum",
30        r#"
31            enum Maybe<T> { Just(T), Nothing }
32            fn main() -> i64 {
33                let m = Maybe::Just(42);
34                match m {
35                    Maybe::Just(x) => x,
36                    Maybe::Nothing => 0,
37                }
38            }
39        "#,
40    );
41    assert_eq!(r1, Value::Int(42));
42
43    let r2 = run(
44        "nested generic structs",
45        r#"
46            struct Cell<T> { value: T }
47            struct Wrap<T> { inner: Cell<T> }
48            fn main() -> i64 {
49                let w = Wrap { inner: Cell { value: 7 } };
50                w.inner.value
51            }
52        "#,
53    );
54    assert_eq!(r2, Value::Int(7));
55
56    println!("all generic_match probes passed");
57}