0

I want to do something similar to a Either.map5 on several Either types. But, instead of keeping just the first Left in case of my Eithers being Left, I want to keep all the Left Either contents, and put them into a List.

Basically instead of the Either<L,R> result of map5 I would like to have a Either<List,R>.

Is there a out-of-the-box way of doing this with dartz ?

LeYAUable
  • 1,613
  • 2
  • 15
  • 30
  • I don't know dartz but if you want to accumulate `Left`s you need another type, because `Either` usually covers error handling. The type you are looking for is often called `Validation` or similar. –  Oct 26 '21 at 08:33
  • Yes, that is also the type I know from Arrow-kt, but I can't find a similar one in dartz. That being said, I made a cheeky solution. Check my own answer. – LeYAUable Oct 26 '21 at 10:20

1 Answers1

0

I've created my own solution to my needs, here it is:

class EitherExtensions {

static Either<List<L>, F> map5AppendingLefts<L, A, A2 extends A, B,
      B2 extends B, C, C2 extends C, D, D2 extends D, E, E2 extends E,F>(
  Either<L, A2> fa,
  Either<L, B2> fb,
  Either<L, C2> fc,
  Either<L, D2> fd,
  Either<L, E2> fe,
  F fun(A a, B b, C c, D d, E e)) {

  IList<Either<L, Object?>> listOfEithers = IList.from([fa, fb, fc, fd, fe]);
  List<L> listOfLefts = List<L>.empty(growable: true);

  if (listOfEithers.any((either) => either.isLeft())) {
  listOfEithers
      .forEach((element) => {element.leftMap((l) => 
  listOfLefts.add(l))});

  return Left(listOfLefts);

} else {
  return Either.map5(fa, fb, fc, fd, fe,
          (A a, B b, C c, D d, E e) => fun(a, b, c, d, e))
         .leftMap((l) => List<L>.empty());
  }
 }
}

Basically, if any of the provided Eithers is a Left I return a left with the list of Left contents, otherwise I call the bundled map5 function and map the left from the final result to an empty list just to match the expected return type, as I already know it is not a left anyways.

LeYAUable
  • 1,613
  • 2
  • 15
  • 30