mirror of
https://github.com/logos-storage/questionable.git
synced 2026-01-02 13:53:11 +00:00
Better type annotations for ->? operator
This commit is contained in:
parent
56e0e123d6
commit
1d5a0222a7
@ -10,19 +10,17 @@ export chaining
|
||||
template `?`*(T: typed): type Option[T] =
|
||||
Option[T]
|
||||
|
||||
template `->?`*(option: ?typed, expression: untyped): untyped =
|
||||
type T = type expression
|
||||
template `->?`*[T,U](option: ?T, expression: U): ?U =
|
||||
if option.isSome:
|
||||
expression.some
|
||||
else:
|
||||
T.none
|
||||
U.none
|
||||
|
||||
template `->?`*(options: (?typed, ?typed), expression: untyped): untyped =
|
||||
type T = type expression
|
||||
template `->?`*[T,U,V](options: (?T, ?U), expression: V): ?V =
|
||||
if options[0].isSome and options[1].isSome:
|
||||
expression.some
|
||||
else:
|
||||
T.none
|
||||
V.none
|
||||
|
||||
template `=?`*[T](name: untyped{nkIdent}, option: ?T): bool =
|
||||
template name: T {.used.} = option.unsafeGet()
|
||||
|
||||
@ -15,19 +15,17 @@ proc success*[T](value: T): ?!T =
|
||||
proc failure*(T: type, error: ref CatchableError): ?!T =
|
||||
err(?!T, error)
|
||||
|
||||
template `->?`*(option: ?!typed, expression: untyped): untyped =
|
||||
type T = type expression
|
||||
if option.isErr:
|
||||
T.failure(option.error)
|
||||
template `->?`*[T,U](value: ?!T, expression: U): ?!U =
|
||||
if value.isErr:
|
||||
U.failure(value.error)
|
||||
else:
|
||||
expression.success
|
||||
|
||||
template `->?`*(options: (?!typed, ?!typed), expression: untyped): untyped =
|
||||
type T = type expression
|
||||
if options[0].isErr:
|
||||
T.failure(options[0].error)
|
||||
elif options[1].isErr:
|
||||
T.failure(options[1].error)
|
||||
template `->?`*[T,U,V](values: (?!T, ?!U), expression: V): ?!V =
|
||||
if values[0].isErr:
|
||||
V.failure(values[0].error)
|
||||
elif values[1].isErr:
|
||||
V.failure(values[1].error)
|
||||
else:
|
||||
expression.success
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user