Skip to content

Unwrapping fold and rewrapping as result #143

@grisumbras

Description

@grisumbras

A common operation with "monadic" wrappers is to take a collection of wrapped values and repackage it as a wrapped collection of values. In other words vector<result<T>> -> result<vector<T>>. In C++ this exact operation is too opinionated (we don't usually actually want to create a new container), so instead I propose a special "fold". Or actually several versions of it.

All three would have the signiture R (Rng, Z, F).

The first version would require Rng to be a range of result<T, E> and F have the signiture auto (Z&, T&&) -> Z. R would be result<Z, E>.

The second version would require Rng to be a range of T, and F have the signiture auto (Z&, T&&) -> result<Z, E>. R would be result<Z, E>.

The third version would require Rng to be a range of result<T, E>, and F have the signiture auto (Z&, T&&) -> result<Z, E>. R would be result<Z, E>. The second version can be viewed as a degenerated version of the third version.

Below is an example of me my implementation of version 1 to implement a custom conversion from to boost::json::value to a container type. Container conversion provided by Boost.JSON have a similar structure. Possibly, I would actually prefer version 2 here (my source range isn't a range of results).

https://godbolt.org/z/74MsK345d

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions