fallible ergonomics

This commit is contained in:
2026-06-30 20:32:13 +02:00
parent 07c560b750
commit 7ca7e33033
8 changed files with 289 additions and 25 deletions
+48 -3
View File
@@ -8,6 +8,8 @@ DetailError :: union(enum) {
empty void
}
BasicOrDetail :: alias BasicError | DetailError
Left :: enum {
left
}
@@ -30,6 +32,7 @@ Box :: alias BoxA | BoxB
maybe func(value i32) i32 ! BasicError {
if (value == 0) return .bad
if (value < 0) return .worse
return value + 1
}
@@ -44,6 +47,41 @@ with_detail func(value i32) i32 ! DetailError {
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
@@ -67,8 +105,15 @@ main func() i32 {
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
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)
@@ -77,6 +122,6 @@ main func() i32 {
empty BoxB = .b
acc = acc + payload(empty)
# 7 + 5 + 5 + 11 + 13 + 2 + 10 + 20 + 8 + 3 = 84
return acc - 84
# 7 + 5 + 5 + 11 + 13 + 2 + 21 + 22 + 35 + 40 + 6 + 50 + 51 + 10 + 20 + 8 + 3 = 309
return acc - 309
}