result: void-ness tightenings (#191)
* better error messages and less pollution
This commit is contained in:
parent
fc349393f6
commit
000eeb14a3
|
@ -447,7 +447,7 @@ template isErr*(self: Result): bool = not self.oResultPrivate
|
||||||
when not defined(nimHasEffectsOfs):
|
when not defined(nimHasEffectsOfs):
|
||||||
template effectsOf(f: untyped) {.pragma, used.}
|
template effectsOf(f: untyped) {.pragma, used.}
|
||||||
|
|
||||||
func map*[T0, E, T1](
|
func map*[T0: not void, E; T1: not void](
|
||||||
self: Result[T0, E], f: proc(x: T0): T1):
|
self: Result[T0, E], f: proc(x: T0): T1):
|
||||||
Result[T1, E] {.inline, effectsOf: f.} =
|
Result[T1, E] {.inline, effectsOf: f.} =
|
||||||
## Transform value using f, or return error
|
## Transform value using f, or return error
|
||||||
|
@ -457,14 +457,18 @@ func map*[T0, E, T1](
|
||||||
## assert r.map(proc (v: int): int = $v).value() == "42"
|
## assert r.map(proc (v: int): int = $v).value() == "42"
|
||||||
## ```
|
## ```
|
||||||
if self.oResultPrivate:
|
if self.oResultPrivate:
|
||||||
result.ok(f(self.vResultPrivate))
|
when T1 is void:
|
||||||
|
f(self.vResultPrivate)
|
||||||
|
result.ok()
|
||||||
|
else:
|
||||||
|
result.ok(f(self.vResultPrivate))
|
||||||
else:
|
else:
|
||||||
when E is void:
|
when E is void:
|
||||||
result.err()
|
result.err()
|
||||||
else:
|
else:
|
||||||
result.err(self.eResultPrivate)
|
result.err(self.eResultPrivate)
|
||||||
|
|
||||||
func map*[T, E](
|
func map*[T: not void, E](
|
||||||
self: Result[T, E], f: proc(x: T)):
|
self: Result[T, E], f: proc(x: T)):
|
||||||
Result[void, E] {.inline, effectsOf: f.} =
|
Result[void, E] {.inline, effectsOf: f.} =
|
||||||
## Transform value using f, or return error
|
## Transform value using f, or return error
|
||||||
|
@ -482,7 +486,7 @@ func map*[T, E](
|
||||||
else:
|
else:
|
||||||
result.err(self.eResultPrivate)
|
result.err(self.eResultPrivate)
|
||||||
|
|
||||||
func map*[E, T1](
|
func map*[E; T1: not void](
|
||||||
self: Result[void, E], f: proc(): T1):
|
self: Result[void, E], f: proc(): T1):
|
||||||
Result[T1, E] {.inline, effectsOf: f.} =
|
Result[T1, E] {.inline, effectsOf: f.} =
|
||||||
## Transform value using f, or return error
|
## Transform value using f, or return error
|
||||||
|
@ -497,7 +501,7 @@ func map*[E, T1](
|
||||||
func map*[E](
|
func map*[E](
|
||||||
self: Result[void, E], f: proc()):
|
self: Result[void, E], f: proc()):
|
||||||
Result[void, E] {.inline, effectsOf: f.} =
|
Result[void, E] {.inline, effectsOf: f.} =
|
||||||
## Call f if value is
|
## Call f if `self` is ok
|
||||||
if self.oResultPrivate:
|
if self.oResultPrivate:
|
||||||
f()
|
f()
|
||||||
result.ok()
|
result.ok()
|
||||||
|
@ -507,7 +511,7 @@ func map*[E](
|
||||||
else:
|
else:
|
||||||
result.err(self.eResultPrivate)
|
result.err(self.eResultPrivate)
|
||||||
|
|
||||||
func flatMap*[T0, E, T1](
|
func flatMap*[T0: not void, E, T1](
|
||||||
self: Result[T0, E], f: proc(x: T0): Result[T1, E]):
|
self: Result[T0, E], f: proc(x: T0): Result[T1, E]):
|
||||||
Result[T1, E] {.inline, effectsOf: f.} =
|
Result[T1, E] {.inline, effectsOf: f.} =
|
||||||
if self.oResultPrivate: f(self.vResultPrivate)
|
if self.oResultPrivate: f(self.vResultPrivate)
|
||||||
|
@ -527,7 +531,7 @@ func flatMap*[E, T1](
|
||||||
else:
|
else:
|
||||||
Result[T1, E].err(self.eResultPrivate)
|
Result[T1, E].err(self.eResultPrivate)
|
||||||
|
|
||||||
func mapErr*[T, E0, E1](
|
func mapErr*[T; E0: not void; E1: not void](
|
||||||
self: Result[T, E0], f: proc(x: E0): E1):
|
self: Result[T, E0], f: proc(x: E0): E1):
|
||||||
Result[T, E1] {.inline, effectsOf: f.} =
|
Result[T, E1] {.inline, effectsOf: f.} =
|
||||||
## Transform error using f, or leave untouched
|
## Transform error using f, or leave untouched
|
||||||
|
@ -539,7 +543,7 @@ func mapErr*[T, E0, E1](
|
||||||
else:
|
else:
|
||||||
result.err(f(self.eResultPrivate))
|
result.err(f(self.eResultPrivate))
|
||||||
|
|
||||||
func mapErr*[T, E1](
|
func mapErr*[T; E1: not void](
|
||||||
self: Result[T, void], f: proc(): E1):
|
self: Result[T, void], f: proc(): E1):
|
||||||
Result[T, E1] {.inline, effectsOf: f.} =
|
Result[T, E1] {.inline, effectsOf: f.} =
|
||||||
## Transform error using f, or return value
|
## Transform error using f, or return value
|
||||||
|
@ -551,7 +555,7 @@ func mapErr*[T, E1](
|
||||||
else:
|
else:
|
||||||
result.err(f())
|
result.err(f())
|
||||||
|
|
||||||
func mapErr*[T, E0](
|
func mapErr*[T; E0: not void](
|
||||||
self: Result[T, E0], f: proc(x: E0)):
|
self: Result[T, E0], f: proc(x: E0)):
|
||||||
Result[T, void] {.inline, effectsOf: f.} =
|
Result[T, void] {.inline, effectsOf: f.} =
|
||||||
## Transform error using f, or return value
|
## Transform error using f, or return value
|
||||||
|
@ -577,7 +581,7 @@ func mapErr*[T](
|
||||||
f()
|
f()
|
||||||
result.err()
|
result.err()
|
||||||
|
|
||||||
func mapConvert*[T0, E](
|
func mapConvert*[T0: not void, E](
|
||||||
self: Result[T0, E], T1: type): Result[T1, E] {.inline.} =
|
self: Result[T0, E], T1: type): Result[T1, E] {.inline.} =
|
||||||
## Convert result value to A using an conversion
|
## Convert result value to A using an conversion
|
||||||
# Would be nice if it was automatic...
|
# Would be nice if it was automatic...
|
||||||
|
@ -592,11 +596,15 @@ func mapConvert*[T0, E](
|
||||||
else:
|
else:
|
||||||
result.err(self.eResultPrivate)
|
result.err(self.eResultPrivate)
|
||||||
|
|
||||||
func mapCast*[T0, E](
|
func mapCast*[T0: not void, E](
|
||||||
self: Result[T0, E], T1: type): Result[T1, E] {.inline.} =
|
self: Result[T0, E], T1: type): Result[T1, E] {.inline.} =
|
||||||
## Convert result value to A using a cast
|
## Convert result value to A using a cast
|
||||||
## Would be nice with nicer syntax...
|
## Would be nice with nicer syntax...
|
||||||
if self.oResultPrivate: result.ok(cast[T1](self.vResultPrivate))
|
if self.oResultPrivate:
|
||||||
|
when T1 is void:
|
||||||
|
result.ok()
|
||||||
|
else:
|
||||||
|
result.ok(cast[T1](self.vResultPrivate))
|
||||||
else:
|
else:
|
||||||
when E is void:
|
when E is void:
|
||||||
result.err()
|
result.err()
|
||||||
|
|
Loading…
Reference in New Issue