diff --git a/questionable/options.nim b/questionable/options.nim index 89b4709..0d0d2b8 100644 --- a/questionable/options.nim +++ b/questionable/options.nim @@ -20,23 +20,14 @@ template `?`*(T: typed): type Option[T] = template `!`*[T](option: ?T): T = option.get -template `->?`*[T,U](option: ?T, expression: U): ?U = - if option.isSome: - expression.some - else: - U.none - template `->?`*[T,U](option: ?T, expression: ?U): ?U = if option.isSome: expression else: U.none -template `->?`*[T,U,V](options: (?T, ?U), expression: V): ?V = - if options[0].isSome and options[1].isSome: - expression.some - else: - V.none +template `->?`*[T,U](option: ?T, expression: U): ?U = + option ->? expression.some template `->?`*[T,U,V](options: (?T, ?U), expression: ?V): ?V = if options[0].isSome and options[1].isSome: @@ -44,6 +35,9 @@ template `->?`*[T,U,V](options: (?T, ?U), expression: ?V): ?V = else: V.none +template `->?`*[T,U,V](options: (?T, ?U), expression: V): ?V = + options ->? expression.some + template `|?`*[T](option: ?T, fallback: T): T = if option.isSome: option.unsafeGet() diff --git a/questionable/results.nim b/questionable/results.nim index 763d2e9..20cd9db 100644 --- a/questionable/results.nim +++ b/questionable/results.nim @@ -47,25 +47,14 @@ proc isSuccess*[T](value: ?!T): bool = proc isFailure*[T](value: ?!T): bool = value.isErr -template `->?`*[T,U](value: ?!T, expression: U): ?!U = - if value.isFailure: - U.failure(value.error) - else: - expression.success - template `->?`*[T,U](value: ?!T, expression: ?!U): ?!U = if value.isFailure: U.failure(value.error) else: expression -template `->?`*[T,U,V](values: (?!T, ?!U), expression: V): ?!V = - if values[0].isFailure: - V.failure(values[0].error) - elif values[1].isFailure: - V.failure(values[1].error) - else: - expression.success +template `->?`*[T,U](value: ?!T, expression: U): ?!U = + value ->? expression.success template `->?`*[T,U,V](values: (?!T, ?!U), expression: ?!V): ?!V = if values[0].isFailure: @@ -75,6 +64,9 @@ template `->?`*[T,U,V](values: (?!T, ?!U), expression: ?!V): ?!V = else: expression +template `->?`*[T,U,V](values: (?!T, ?!U), expression: V): ?!V = + values ->? expression.success + template `|?`*[T,E](value: Result[T,E], fallback: T): T = value.valueOr(fallback)