The Validate
effect is similar to the
Either
effect but let you accumulate failures:
import org.atnos.eff._, all._, syntax.all._
/**
* Stack declaration
*/
type S = Fx.fx1[Validate[String, *]]
def checkPositiveInt(i: Int): Eff[S, Unit] =
validateCheck(i >= 0, s"$i is not positive")
def checkPositiveInts(a: Int, b: Int, c: Int): Eff[S, (Int, Int, Int)] = for {
_ <- checkPositiveInt(a)
_ <- checkPositiveInt(b)
_ <- checkPositiveInt(c)
} yield (a, b, c)
checkPositiveInts(1, -3, -2).runNel.run
> Left(NonEmptyList(-3 is not positive, -2 is not positive))