Defined in The disjunction keeps the first operand that worked values sum into a and errors multiply into a present only when every operand failed Each carrier s header declares its own this header defines the n ary fold over it This is the operator s disjunction meaning told apart by its right operand a carrier With a pipeline functor on the right it feeds the carrier into that operation instead The verb object disjoin The operator The binary disjunction each carrier declares is its n ary fold Call signatures a | b copack pack | disjoin_t disjoin 1 The n ary disjunction disjoin a b c The n ary fold of the disjunction operator | over the monadic carriers a single argument is forwarded unchanged Carriers only in every arity disjunction has no data level form An identity cluster operand makes the whole disjunction total folding the result into just or choice disjoin template <typename Lh typename Rh> constexpr auto operator| Lh &&lh Rh &&rh 1 constexpr auto operator| Lh && Rh && > fn just<void> 2 constexpr auto operator| Lh &&lh Rh &&rh 3 template <some_expected_void Lh some_expected_void Rh> constexpr auto operator| Lh &&lh Rh &&rh 4 template <typename Lh typename Rh> constexpr auto operator| Lh &&lh Rh &&rh 5 template <some_expected_void Lh typename Rh> constexpr auto operator| Lh &&lh Rh &&rh 6 template <typename Lh some_expected_void Rh> constexpr auto operator| Lh &&lh Rh &&rh 7 template <some_optional Lh some_optional Rh> constexpr auto operator| Lh &&lh Rh &&rh 8 The disjunction of carriers values sum into a copack errors multiply into a pack a | b yields the leftmost operand that worked its value injected into the sum of the value types a same type pair stays bare and a void side enters a genuine sum as pack<> What remains when none worked depends on the carrier an expected holds the product of every error all evidence kept positionally an optional is simply empty its unit errors vanishing in that product a choice or just always works so the disjunction is total Both operands are fully constructed before the operator runs a value selection rule not a lazy fallback An identity cluster operand makes the whole disjunction total collapsing the result into just or choice return The carrier of the summed value side over the error product lh Lh && Left operand rh Rh && Right operand template <some_monadic_type Arg> constexpr auto operator Arg &&arg const > decltype arg 1 template <typename Arg typename Args> constexpr auto operator Arg &&arg Args && args const 2 Forwards a single carrier unchanged return The carrier forwarded arg Arg && The carrier Folds the carriers into their disjunction The n ary form of operator | the result holds the first operand that worked its values summing into a copack and the errors multiply into a pack reached only where every operand failed An identity cluster operand makes the whole disjunction total return The folded disjunction arg Arg && The leading carrier args Args && Further carriers to disjoin