## 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