diff options
Diffstat (limited to 'std/option.zc')
| -rw-r--r-- | std/option.zc | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/std/option.zc b/std/option.zc new file mode 100644 index 0000000..5652bd7 --- /dev/null +++ b/std/option.zc @@ -0,0 +1,53 @@ + +import "./core.zc" + +struct Option<T> { + is_some: bool; + val: T; +} + +impl Option<T> { + fn Some(v: T) -> Option<T> { + return Option<T> { is_some: true, val: v }; + } + + fn None() -> Option<T> { + return Option<T> { is_some: false, val: 0 }; + } + + fn is_some(self) -> bool { + return self.is_some; + } + + fn is_none(self) -> bool { + return !self.is_some; + } + + fn unwrap(self) -> T { + if (!self.is_some) { + !"Panic: unwrap called on None"; + exit(1); + } + return self.val; + } + + fn unwrap_or(self, def_val: T) -> T { + if (self.is_some) { + return self.val; + } + return def_val; + } + + fn expect(self, msg: char*) -> T { + if (!self.is_some) { + !"Panic: {msg}"; + exit(1); + } + return self.val; + } + + fn or_else(self, other: Option<T>) -> Option<T> { + if self.is_some { return *self; } + return other; + } +} |
