diff --git a/core/src/main/scala/cats/data/WriterT.scala b/core/src/main/scala/cats/data/WriterT.scala index f0c683b595..9c85d97f52 100644 --- a/core/src/main/scala/cats/data/WriterT.scala +++ b/core/src/main/scala/cats/data/WriterT.scala @@ -57,7 +57,13 @@ final case class WriterT[F[_], L, V](run: F[(L, V)]) { def show(implicit F: Show[F[(L, V)]]): String = F.show(run) } -object WriterT extends WriterTInstances with WriterTFunctions + +object WriterT extends WriterTInstances with WriterTFunctions { + + def lift[F[_], L, V](fv: F[V])(implicit monoidL: Monoid[L], F: Applicative[F]): WriterT[F, L, V] = + WriterT(F.map(fv)(v => (monoidL.empty, v))) + +} private[data] sealed abstract class WriterTInstances extends WriterTInstances0 { diff --git a/tests/src/test/scala/cats/tests/WriterTTests.scala b/tests/src/test/scala/cats/tests/WriterTTests.scala index 1f589afe97..b41c680b23 100644 --- a/tests/src/test/scala/cats/tests/WriterTTests.scala +++ b/tests/src/test/scala/cats/tests/WriterTTests.scala @@ -65,7 +65,15 @@ class WriterTTests extends CatsSuite { WriterT.valueT[Id, Int, Int](i).value should === (i) } } - + + test("Writer.pure and WriterT.lift are consistent") { + forAll { (i: Int) => + val writer: Writer[String, Int] = Writer.value(i) + val writerT: WriterT[Option, String, Int] = WriterT.lift(Some(i)) + writer.run.some should === (writerT.run) + } + } + test("show") { val writerT: WriterT[Id, List[String], String] = WriterT.put("foo")(List("Some log message")) writerT.show should === ("(List(Some log message),foo)")