Skip to content

Instantly share code, notes, and snippets.

@tbrown1979
Forked from PaulAtBanno/Flip.scala
Created April 17, 2017 01:33
Show Gist options
  • Save tbrown1979/3784a72cdea784fb7815c07153f07f68 to your computer and use it in GitHub Desktop.
Save tbrown1979/3784a72cdea784fb7815c07153f07f68 to your computer and use it in GitHub Desktop.
Tasks to Task of ValidationNel
import scalaz._, Scalaz._
import scalaz.concurrent.Task
object flip {
def flip: String = {
val rnd = new java.util.Random()
if (rnd.nextInt(2) == 1) {
"Heads"
} else {
throw new RuntimeException("Tails")
}
}
val flips = List(Task.delay(flip), Task.delay(flip), Task.delay(flip), Task.delay(flip), Task.delay(flip))
val flipLists = flips.map(_.map(List(_))) // Turn Heads/Tails into List (Monoid)
val attempts = flipLists.map(_.attempt) // List[Task[Throwable \/ List[String]]]
val validations = attempts.map(_.map(_.validation)) // List[Task[Validation[Throwable, List[String]]]]
val vNels = validations.map(_.map(_.toValidationNel)) // List[Task[ValidationNel[Throwable, List[String]]]]
val task = Nondeterminism[Task].aggregate(vNels) // Task[ValidationNel[Throwable, List[String]]]
/*
scala> task.unsafePerformSync
res1: scalaz.ValidationNel[Throwable,List[String]] = Failure(NonEmpty[java.lang.RuntimeException: Tails,java.lang.RuntimeException: Tails,java.lang.RuntimeException: Tails])
*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment