diff --git a/batteries/result.luau b/batteries/result.luau new file mode 100644 index 00000000..9b4a1382 --- /dev/null +++ b/batteries/result.luau @@ -0,0 +1,36 @@ +type T = | { success: true, value: Value } | { success: false, traceback: string, err: string } + +local result = {} + +function result.ok(value: Value): T + return { + success = true, + value = value, + } +end + +function result.fail(err: string): T + -- Ignore the current call to debug.traceback, and the call to fail. + local traceback = debug.traceback(nil, 2) + + return { + success = false, + + traceback = traceback, + err = err, + } +end + +function result.pcall(f: (T...) -> R, ...: T...): T + local success, value = pcall(f, ...) + + if success then + return result.ok(value) + else + local err = value :: any + + return result.fail(err) + end +end + +return result