diff --git a/free/src/main/scala/cats/free/Free.scala b/free/src/main/scala/cats/free/Free.scala index 336e27d6ff..b7a083610b 100644 --- a/free/src/main/scala/cats/free/Free.scala +++ b/free/src/main/scala/cats/free/Free.scala @@ -141,6 +141,24 @@ sealed abstract class Free[S[_], A] extends Product with Serializable { } }(Free.catsFreeMonadForFree) + /** + * Lift into `G` (typically a `Coproduct`) given `Inject`. Analogous + * to `Free.inject` but lifts programs rather than constructors. + * + *{{{ + *scala> type Lo[A] = cats.data.Coproduct[List, Option, A] + *defined type alias Lo + * + *scala> val fo = Free.liftF(Option("foo")) + *fo: cats.free.Free[Option,String] = Free(...) + * + *scala> fo.inject[Lo] + *res4: cats.free.Free[Lo,String] = Free(...) + *}}} + */ + final def inject[G[_]](implicit ev: Inject[S, G]): Free[G, A] = + compile(λ[S ~> G](ev.inj(_))) + override def toString: String = "Free(...)" }