package httpz

import scalaz._, Free._

object Z {

  private[httpz] def freeCMonad[S[_]]: Monad[({type λ[α] = FreeC[S, α]})] =
    Free.freeMonad[({type λ[α] = Coyoneda[S, α]})#λ]

  def mapSuspensionFreeC[F[_], G[_], A](c: FreeC[F, A], f: F ~> G): FreeC[G, A] = {
    type CoyonedaG[B] = Coyoneda[G, B]
    c.mapSuspension[CoyonedaG](new (({type λ[α] = Coyoneda[F, α]})~> CoyonedaG){
      def apply[C](a: Coyoneda[F, C]) = a.trans(f)
    })
  }
}