This set of helpers allows treating Result and Opt as collections of 0
or 1 item, allowing iterating over them and checking "membership" - such
integration is useful in generic code which can then be generalised to
handle more complex cases - the integration is most useful with Opt.
One design tradeoff here is the "explicitness" of `items` vs `values`
for `Result` - technically error and value are "equal" and therefore we
shouldn't give preference to the value, but there exists a convenience
argument to treat the value as the "default" and therefore define
`items` / `contains` for `Result` as well - this PR chooses the more
conservative and explicit approach - a more liberal version can easily
be added later should motivating examples emerge.
For serialization and parsing, distinguishing enums with numeric values
from enums with associated strings for each value is useful. This adds
foundational helpers to allow such distinction.
Add `optError`, `optValue`, to convert back and forth between Opt and Result
These conversions end up being more common than others since "trivial" success/fail-style API often use Opt while combining such API into combined operations tends to prefer richer error reporting.
These two helpers complete `valueOr` and `errorOr` to cover `void` cases
where no value should be returned or `Result[void, E]` /
`Result[T, void]` is being used - they can be used for a convient
early-return style in side-effectful proc:s:
```nim
v.update().isOkOr:
echo "update failed: ", error
```
* Migrate to `unittest2`
why:
Global symbol overflow when running NIM 1.2 on Github ci suggests that
unit tests run sort of separately. The replacement library `unittest2`
provides that.
* Build ci dependencies
* Added `IntervalSet`, sets of non-adjacent intervals
Relocated from nimbus-eth1 snap sync development
* Fix local import directive
* Fix --styleCheck complaints
* Attempt to get around CI problem by varying items
details:
Vary all_tests exec list
Hide useless globalness of `noisy` constant in non-debugging mode
* Re-route KeyError exceptions as Defect for all except the `[]` function
why:
Access via key is verified, error is returned via Result[]
* Refactor lruFetch() item rotation
why:
Previously, the item was deleted and re-inserted in the table although
for rotation, only the queue links need to be updated.
* Delete some KeyError annotations
why:
Was overlooked earlier
* More KeyError fixes
* `Result` refresh
* add full support for `Result[T, void]` (aka `Opt[T]` aka `Option[T]`)
* expand tests
* add `flatten`, `filter` of `Option` fame
* add `tryError` that raises a regular exception when result holds a
value
* fix `$` to print `ok`/`err` in lower-case, like the functions that
created the result
* add `orErr` that collapses all errors to a single value of a
potentially different type - useful when translating errors between
layers
* `capture` should work with `CatchableError`
* remove `Defect`-dependent tests
* Update stew/results.nim
* avoid redundant error message when converting error to string
* avoid multiple evaluation in `valueOr`
* add `unsafeError` to match `unsafeGet`
* let `valueOr` evaluate a block
* add `errorOr` to mirror `valueOr`
Looking at generated assembly, it turns out the optimizer is not smart
enough to get rid of the loop - use `copyMem` instead.
At least the compiler is smart enough to constant-propagate runtime
endian direction, resolving the review comment.
Also clarify why a minimum length is enfored - it could perhaps be
revisited, but that would leave a slightly odd API.
the `array` overloads are actually unnecessary with an optimizing
compiler - as long as it can prove the length, any extra checks will go
away on their own
also add `initCopyFrom`
* document optimizations