128 lines
2.0 KiB
Plaintext
128 lines
2.0 KiB
Plaintext
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
|
|
}
|