diff options
Diffstat (limited to 'std/default/options.pk')
-rw-r--r-- | std/default/options.pk | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/std/default/options.pk b/std/default/options.pk new file mode 100644 index 0000000..f1bcac4 --- /dev/null +++ b/std/default/options.pk @@ -0,0 +1,87 @@ +## std/options +## This module is imported by default. + +import std/format + +pub type Option[T] = union + Some: T + None + +pub func is_some[T](self: Option[T]): bool = + self of Some(_) +pub func is_none[T](self: Option[T]): bool = + not self.is_some + +## Converts an Option[T] to a Result[T, E] given a user-provided error. +pub func err[T, E](self: Option[T], error: E): Result[T, E] = + if self of Some(x): + Okay(x) + else: + Error(error) + +## Applies a function to T, if it exists. +pub func map[T, U](self: Option[T], proc: T -> U): Option[U] = + if self of Some(x): + Some(x.proc) + else: + None +## Converts T to a None, if proc returns false and it exists. +pub func filter[T](self: Option[T], proc: T -> bool): Option[T] = + if self of Some(x) and proc(x): + Some(x) + else: + None + +## Applies a function to T, if it exists. Equivalent to .map(func).flatten. +pub func flatmap[T, U](self: Option[T], proc: T -> Option[U]): Option[U] = + if self of Some(x): + x.proc + else: + None +## Converts from Option[Option[T]] to Option[T]. +pub func flatten[T](self: Option[Option[T]]): Option[T] = # todo: better name? + match self + of Some(Some(x)): + Some(x) + of _: + None + +## Returns the inner value or a default. +pub func or[T](self: Option[T], default: T): T = + if self of Some(x): x + else: default +## Directly accesses the inner value. Throws an exception if None. +pub yeet func get[T](self: Option[T]): T = + if self of Some(x): x + else: raise Exception # todo: syntax?? + +# todo: direct access, alias to get +macro `!`[T](self: Option[T]): T +# todo: indirect access, ??? do we propagate? is this useful? probably not +macro `?`[T](self: Option[T]): T +# todo: field access? useful? assignment? +macro `.?`[T](self: Option[T]) + +## Overloads the == operation for use on Options. +pub func `==`[T](a, b: Option[T]): bool = + match (a, b) + of (Some(x), Some(y)): + x == y + of _: + false + +## Overloads the str() function for use on Options. +pub func str[T](self: Option[T]): str = + if self of Some(x): + fmt("some({})", x.str) + else: + "none" + +examples: + let x = Some(42) + if x of Some(y): + assert x! == y + +# references: +# https://nim-lang.github.io/Nim/options.html +# https://doc.rust-lang.org/std/option/enum.Option.html |