From fb32da2f027d03448e93bec65aa23c4f9256e5b9 Mon Sep 17 00:00:00 2001 From: zainab-ali Date: Thu, 22 Sep 2016 20:29:08 +0100 Subject: [PATCH] Adding reader method to MonadReader --- core/src/main/scala/cats/MonadReader.scala | 3 +++ laws/src/main/scala/cats/laws/MonadReaderLaws.scala | 3 +++ .../src/main/scala/cats/laws/discipline/MonadReaderTests.scala | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/cats/MonadReader.scala b/core/src/main/scala/cats/MonadReader.scala index 5614ced482..3902892b87 100644 --- a/core/src/main/scala/cats/MonadReader.scala +++ b/core/src/main/scala/cats/MonadReader.scala @@ -7,6 +7,9 @@ trait MonadReader[F[_], R] extends Monad[F] { /** Modify the environment */ def local[A](f: R => R)(fa: F[A]): F[A] + + /** Retrieves a function of the environment */ + def reader[A](f: R => A): F[A] = map(ask)(f) } object MonadReader { diff --git a/laws/src/main/scala/cats/laws/MonadReaderLaws.scala b/laws/src/main/scala/cats/laws/MonadReaderLaws.scala index d72421cf32..69c5652379 100644 --- a/laws/src/main/scala/cats/laws/MonadReaderLaws.scala +++ b/laws/src/main/scala/cats/laws/MonadReaderLaws.scala @@ -16,6 +16,9 @@ trait MonadReaderLaws[F[_], R] extends MonadLaws[F] { def monadReaderLocalFlatMap[A, B](fra: F[A], f: A => F[B], g: R => R): IsEq[F[B]] = F.local(g)(F.flatMap(fra)(f)) <-> F.flatMap(F.local(g)(fra))(a => F.local(g)(f(a))) + + def monadReaderReaderAsk[A](f: R => A): IsEq[F[A]] = + F.reader(f) <-> F.map(F.ask)(f) } object MonadReaderLaws { diff --git a/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala b/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala index b772837ddc..eda00a53a7 100644 --- a/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala +++ b/laws/src/main/scala/cats/laws/discipline/MonadReaderTests.scala @@ -36,7 +36,8 @@ trait MonadReaderTests[F[_], R] extends MonadTests[F] { "monadReader ask idempotent" -> laws.monadReaderAskIdempotent, "monadReader local ask" -> forAll(laws.monadReaderLocalAsk _), "monadReader local pure" -> forAll(laws.monadReaderLocalPure[A] _), - "monadReader local flatMap" -> forAll(laws.monadReaderLocalFlatMap[A, B] _) + "monadReader local flatMap" -> forAll(laws.monadReaderLocalFlatMap[A, B] _), + "monadReader reader ask" -> forAll(laws.monadReaderReaderAsk[A] _) ) } }