enum struct Option { []: None T : Some impl: inline fn Option.Some(T) -> [Option] cast(Option::Some) inline fn Option.None() -> [Option] { [] cast(Option::None) } inline fn Option.is_some(&Option) -> [bool] { @ match { Option::Some { true } Option::None { false } } } inline fn Option.is_none(&Option) -> [bool] { Option.is_some lnot } inline fn Option.take_is_some(Option: option) -> [bool] { &option Option.is_some } inline fn Option.unwrap(Option) -> [T] match { Option::Some as [t] { t } Option::None { "Unwrapped a None variant" println 1 exit } } fn Option.unwrap_or(T Option) -> [T] match { Option::Some as [t] { drop t } Option::None {} } } impl Print> requires: [Print] { fn print(Option) match { Option::Some as [t] { "Some(" print t print ")" print } Option::None { "None" print } } }