BasicError :: enum { bad worse } DetailError :: union(enum) { code i32 empty void } BasicOrDetail :: alias BasicError | DetailError Left :: enum { left } Right :: enum { right } Both :: alias Left | Right BoxA :: union(enum) { a i32 } BoxB :: union(enum) { b void } Box :: alias BoxA | BoxB maybe func(value i32) i32 ! BasicError { if (value == 0) return .bad if (value < 0) return .worse return value + 1 } via_try func(value i32) i32 ! BasicError { unwrapped :: try maybe(value) return unwrapped + 1 } with_detail func(value i32) i32 ! DetailError { if (value == 0) return DetailError{ code = 5 } if (value == 1) return .empty return value } via_widen func(value i32) i32 ! BasicOrDetail { unwrapped :: try maybe(value) return unwrapped + 2 } catch_basic func(value i32) i32 { return maybe(value) catch |e| { if (e == .bad) { yield 21 } else { yield 22 } } } catch_detail func(value i32) i32 { return with_detail(value) catch |e| { match e { .code |n|: yield n + 30 .empty: yield 40 } } } catch_widen func(value i32) i32 { return via_widen(value) catch |e| { match e { .bad: yield 50 .worse: yield 51 .code |n|: yield n .empty: yield 52 } } } pick func(value Both) i32 { match value { .left: return 10 .right: return 20 } } payload func(value Box) i32 { match value { .a |n|: return n .b: return 3 } } main func() i32 { acc i32 = 0 a :: maybe(0) catch 7 b :: maybe(4) catch 99 c :: via_try(3) catch 99 d :: via_try(0) catch 11 e :: with_detail(0) catch 13 f :: with_detail(2) catch 99 g :: catch_basic(0) h :: catch_basic(-1) i :: catch_detail(0) j :: catch_detail(1) k :: via_widen(3) catch 99 l :: catch_widen(0) m :: catch_widen(-1) acc = acc + a + b + c + d + e + f + g + h + i + j + k + l + m acc = acc + pick(.left) r Right = .right acc = acc + pick(r) box BoxA = BoxA{ a = 8 } acc = acc + payload(box) empty BoxB = .b acc = acc + payload(empty) # 7 + 5 + 5 + 11 + 13 + 2 + 21 + 22 + 35 + 40 + 6 + 50 + 51 + 10 + 20 + 8 + 3 = 309 return acc - 309 }