All Downloads are FREE. Search and download functionalities are using the official Maven repository.

au.id.tmm.bfect.BiInvariant.scala Maven / Gradle / Ivy

package au.id.tmm.bfect

trait BiInvariant[F[_, _]] {

  def biImap[L1, L2, R1, R2](
    fl1r1: F[L1, R1],
  )(
    fl1l2: L1 => L2,
    fr1r2: R1 => R2,
  )(
    fl2l1: L2 => L1,
    fr2r1: R2 => R1,
  ): F[L2, R2]

}

object BiInvariant {

  def apply[F[_, _] : BiInvariant]: BiInvariant[F] = implicitly

  trait ToBiInvariantOps {
    implicit def toBiInvariantOps[F[_, _], L1, R1](
      fl1r1: F[L1, R1],
    )(implicit
      biInvariant: BiInvariant[F],
    ): Ops[F, L1, R1] =
      new Ops[F, L1, R1](fl1r1)
  }

  final class Ops[F[_, _], L1, R1](fl1r1: F[L1, R1])(implicit biInvariant: BiInvariant[F]) {
    def biImap[L2, R2](fl1l2: L1 => L2, fr1r2: R1 => R2)(fl2l1: L2 => L1, fr2r1: R2 => R1): F[L2, R2] =
      biInvariant.biImap(fl1r1)(fl1l2, fr1r2)(fl2l1, fr2r1)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy