Better type annotations for ->? operator

This commit is contained in:
Mark Spanbroek 2021-03-13 11:46:26 +01:00
parent 56e0e123d6
commit 1d5a0222a7
2 changed files with 12 additions and 16 deletions

View File

@ -10,19 +10,17 @@ export chaining
template `?`*(T: typed): type Option[T] = template `?`*(T: typed): type Option[T] =
Option[T] Option[T]
template `->?`*(option: ?typed, expression: untyped): untyped = template `->?`*[T,U](option: ?T, expression: U): ?U =
type T = type expression
if option.isSome: if option.isSome:
expression.some expression.some
else: else:
T.none U.none
template `->?`*(options: (?typed, ?typed), expression: untyped): untyped = template `->?`*[T,U,V](options: (?T, ?U), expression: V): ?V =
type T = type expression
if options[0].isSome and options[1].isSome: if options[0].isSome and options[1].isSome:
expression.some expression.some
else: else:
T.none V.none
template `=?`*[T](name: untyped{nkIdent}, option: ?T): bool = template `=?`*[T](name: untyped{nkIdent}, option: ?T): bool =
template name: T {.used.} = option.unsafeGet() template name: T {.used.} = option.unsafeGet()

View File

@ -15,19 +15,17 @@ proc success*[T](value: T): ?!T =
proc failure*(T: type, error: ref CatchableError): ?!T = proc failure*(T: type, error: ref CatchableError): ?!T =
err(?!T, error) err(?!T, error)
template `->?`*(option: ?!typed, expression: untyped): untyped = template `->?`*[T,U](value: ?!T, expression: U): ?!U =
type T = type expression if value.isErr:
if option.isErr: U.failure(value.error)
T.failure(option.error)
else: else:
expression.success expression.success
template `->?`*(options: (?!typed, ?!typed), expression: untyped): untyped = template `->?`*[T,U,V](values: (?!T, ?!U), expression: V): ?!V =
type T = type expression if values[0].isErr:
if options[0].isErr: V.failure(values[0].error)
T.failure(options[0].error) elif values[1].isErr:
elif options[1].isErr: V.failure(values[1].error)
T.failure(options[1].error)
else: else:
expression.success expression.success