@@ -372,11 +372,11 @@ public final <B> Option<P2<A,B>> bindProduct(final Option<B> ob) {
372372 public final <B , C > Option <P3 <A ,B ,C >> bindProduct (final Option <B > ob , final Option <C > oc ) {
373373 return bind (ob , oc , P .p3 ());
374374 }
375-
375+
376376 public final <B , C , D > Option <P4 <A ,B ,C ,D >> bindProduct (final Option <B > ob , final Option <C > oc , final Option <D > od ) {
377377 return bind (ob , oc , od , P .p4 ());
378378 }
379-
379+
380380 public final <B ,C ,D ,E > Option <P5 <A ,B ,C ,D ,E >> bindProduct (final Option <B > ob , final Option <C > oc , final Option <D > od ,
381381 final Option <E > oe ) {
382382 return bind (ob , oc , od , oe , P .p5 ());
@@ -712,7 +712,7 @@ public static <A> Option<A> join(final Option<Option<A>> o) {
712712 }
713713
714714 /**
715- * Sequence through the option monad.
715+ * Sequence a list through the option monad.
716716 *
717717 * @param a The list of option to sequence.
718718 * @return The option of list after sequencing.
@@ -723,6 +723,16 @@ public static <A> Option<List<A>> sequence(final List<Option<A>> a) {
723723 a .head ().bind (aa -> sequence (a .tail ()).map (cons_ (aa )));
724724 }
725725
726+ /**
727+ * Sequence a validation through the option monad.
728+ *
729+ * @param a The validation of option to sequence.
730+ * @return The option of validation after sequencing.
731+ */
732+ public static <E , A > Option <Validation <E , A >> sequence (final Validation <E , Option <A >> a ) {
733+ return a .traverseOption (identity ());
734+ }
735+
726736 /**
727737 * Returns an optional value that has a value of the given argument, if the given predicate holds
728738 * on that argument, otherwise, returns no value.
0 commit comments