contravariant.scala
package com.zibaldone.cats
package ch_04
// contravariant type class
trait Format[T]:
def format(value: T): String
// functor applies transformations in order
// contramap applies transformation in reverse order
def contramap[A](f: A => T): Format[A] = (a: A) => format(f(a))
trait `contravariant`[F[_]] extends ch_04.`invariant`[F]:
def contramap[A, B](fa: F[A])(f: B => A): F[B]
override def imap[A, B](fa: F[A])(forth: A => B)(back: B => A): F[B] = contramap(fa)(back)