Validated

Validated provides projections for cats.data.Validated. Valid(r) holds a success value and Invalid(l) holds an error value. The two projections route each side into the pipeline independently, yielding Status.Success in both the matching and non-matching cases.

Both are polymorphic singletons. Use Validated.Valid[T] and Validated.Invalid[T] to obtain typed Projection[cats.data.Validated[?, T], T] and Projection[cats.data.Validated[T, ?], T] respectively.

import h8io.stages.cats.*
val validStage   = Validated.Valid[String]
// validStage: h8io.stages.base.Projection[Validated.Validated[?$5, String], String] = <function1>
val invalidStage = Validated.Invalid[String]
// invalidStage: h8io.stages.base.Projection[Validated.Validated[String, ?$2], String] = <function1>

validStage(success)
// res0: h8io.stages.Yield[Validated.Validated[?$5, String], String, Nothing] = Some(
//   out = "hello",
//   status = Success,
//   evolution = <function1>
// )
validStage(failure)
// res1: h8io.stages.Yield[Validated.Validated[?$5, String], String, Nothing] = None(
//   status = Success,
//   evolution = <function1>
// )

invalidStage(success)
// res2: h8io.stages.Yield[Validated.Validated[String, ?$2], String, Nothing] = None(
//   status = Success,
//   evolution = <function1>
// )
invalidStage(failure)
// res3: h8io.stages.Yield[Validated.Validated[String, ?$2], String, Nothing] = Some(
//   out = "error",
//   status = Success,
//   evolution = <function1>
// )