diff --git a/questionable/options.nim b/questionable/options.nim index b262ba9..eb9c3d5 100644 --- a/questionable/options.nim +++ b/questionable/options.nim @@ -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() diff --git a/questionable/results.nim b/questionable/results.nim index afb2b4a..120227d 100644 --- a/questionable/results.nim +++ b/questionable/results.nim @@ -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