public static TResult Match <T, TResult>(this JoinOption <T> option, Func <T, TResult> some, Func <TResult> none)
 => option.HasValue ? some.Invoke(option.Value) : none.Invoke();
 public static T GetOrElse <T>(this JoinOption <T> option, T defaultValue)
 => option.HasValue ? option.Value : defaultValue;