It generates code for algebraic data types which offer a typesafe interface similar to the `case` statements in languages that natively support pattern matching.
sealed trait Either[A, B] final case class Left[A, B](a: A) extends Either[A, B] final case class Right[A, B](b: B) extends Either[A, B]
with derive4j:
@Data interface Either<A, B> { <X> X match(Function<A, X> left, Function<B, X> right); }
@Data interface Either<A, B> { interface Cases<X> { X left(A leftValue); X right(B rightValue); } <X> X match(Cases<X> cases); }
The real drawback of (any) java implementation is lack of TCO.
It generates code for algebraic data types which offer a typesafe interface similar to the `case` statements in languages that natively support pattern matching.