From cf1548adf0fa6ade51cd8a68f5b5426738faf4c8 Mon Sep 17 00:00:00 2001 From: Kai <450507+neko-kai@users.noreply.github.com> Date: Wed, 19 Jun 2024 20:01:30 +0100 Subject: [PATCH] Fix impure repositories in cats-effect examples --- .../src/main/scala/leaderboard/repo/Ladder.scala | 15 +++++++-------- .../main/scala/leaderboard/repo/Profiles.scala | 15 +++++++-------- .../src/main/scala/leaderboard/repo/Ladder.scala | 11 ++++------- .../main/scala/leaderboard/repo/Profiles.scala | 10 ++++------ 4 files changed, 22 insertions(+), 29 deletions(-) diff --git a/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Ladder.scala b/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Ladder.scala index baa8b26..6aced8c 100644 --- a/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Ladder.scala +++ b/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Ladder.scala @@ -1,7 +1,8 @@ package leaderboard.repo -import cats.{Applicative, Monad} -import cats.implicits.* +import cats.Monad +import cats.effect.{Concurrent, Ref} +import cats.syntax.all.* import distage.Lifecycle import doobie.postgres.implicits.* import doobie.syntax.string.* @@ -9,24 +10,22 @@ import leaderboard.model.{Score, UserId} import leaderboard.sql.SQL import logstage.LogIO -import scala.collection.concurrent.TrieMap - trait Ladder[F[_]] { def submitScore(userId: UserId, score: Score): F[Unit] def getScores: F[List[(UserId, Score)]] } object Ladder { - final class Dummy[F[_]: Applicative] + final class Dummy[F[_]: Concurrent] extends Lifecycle.LiftF[F, Ladder[F]](for { - state <- Applicative[F].pure(TrieMap.empty[UserId, Score]) + state <- Ref.of(Map.empty[UserId, Score]) } yield { new Ladder[F] { override def submitScore(userId: UserId, score: Score): F[Unit] = - Applicative[F].pure(state.update(userId, score)) + state.update(_ + (userId -> score)) override def getScores: F[List[(UserId, Score)]] = - Applicative[F].pure(state.toList.sortBy(_._2)(Ordering[Score].reverse)) + state.get.map(_.toList.sortBy(_._2)(Ordering[Score].reverse)) } }) diff --git a/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Profiles.scala b/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Profiles.scala index 5dc7da0..e39a364 100644 --- a/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Profiles.scala +++ b/distage-example-monofunctor-tf/src/main/scala/leaderboard/repo/Profiles.scala @@ -1,32 +1,31 @@ package leaderboard.repo +import cats.Monad +import cats.effect.{Concurrent, Ref} +import cats.syntax.all.* import distage.Lifecycle -import cats.{Applicative, Monad} -import cats.implicits.* import doobie.postgres.implicits.* import doobie.syntax.string.* import leaderboard.model.{UserId, UserProfile} import leaderboard.sql.SQL import logstage.LogIO -import scala.collection.concurrent.TrieMap - trait Profiles[F[_]] { def setProfile(userId: UserId, profile: UserProfile): F[Unit] def getProfile(userId: UserId): F[Option[UserProfile]] } object Profiles { - final class Dummy[F[_]: Applicative] + final class Dummy[F[_]: Concurrent] extends Lifecycle.LiftF[F, Profiles[F]](for { - state <- Applicative[F].pure(TrieMap.empty[UserId, UserProfile]) + state <- Ref.of(Map.empty[UserId, UserProfile]) } yield { new Profiles[F] { override def setProfile(userId: UserId, profile: UserProfile): F[Unit] = - Applicative[F].pure(state.update(userId, profile)) + state.update(_ + (userId -> profile)) override def getProfile(userId: UserId): F[Option[UserProfile]] = - Applicative[F].pure(state.get(userId)) + state.get.map(_.get(userId)) } }) diff --git a/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Ladder.scala b/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Ladder.scala index b97646a..6821aa8 100644 --- a/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Ladder.scala +++ b/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Ladder.scala @@ -1,7 +1,6 @@ package leaderboard.repo -import cats.effect.IO -import cats.implicits.* +import cats.effect.{IO, Ref} import distage.Lifecycle import doobie.postgres.implicits.* import doobie.syntax.string.* @@ -9,8 +8,6 @@ import leaderboard.model.{Score, UserId} import leaderboard.sql.SQL import logstage.LogIO -import scala.collection.concurrent.TrieMap - trait Ladder { def submitScore(userId: UserId, score: Score): IO[Unit] def getScores: IO[List[(UserId, Score)]] @@ -19,14 +16,14 @@ trait Ladder { object Ladder { final class Dummy extends Lifecycle.LiftF[IO, Ladder](for { - state <- IO.pure(TrieMap.empty[UserId, Score]) + state <- Ref[IO].of(Map.empty[UserId, Score]) } yield { new Ladder { override def submitScore(userId: UserId, score: Score): IO[Unit] = - IO.pure(state.update(userId, score)) + state.update(_ + (userId -> score)) override def getScores: IO[List[(UserId, Score)]] = - IO.pure(state.toList.sortBy(_._2)(Ordering[Score].reverse)) + state.get.map(_.toList.sortBy(_._2)(Ordering[Score].reverse)) } }) diff --git a/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Profiles.scala b/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Profiles.scala index 9bc580a..e908355 100644 --- a/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Profiles.scala +++ b/distage-example-monomorphic-cats/src/main/scala/leaderboard/repo/Profiles.scala @@ -1,6 +1,6 @@ package leaderboard.repo -import cats.effect.IO +import cats.effect.{IO, Ref} import distage.Lifecycle import doobie.postgres.implicits.* import doobie.syntax.string.* @@ -8,8 +8,6 @@ import leaderboard.model.{UserId, UserProfile} import leaderboard.sql.SQL import logstage.LogIO -import scala.collection.concurrent.TrieMap - trait Profiles { def setProfile(userId: UserId, profile: UserProfile): IO[Unit] def getProfile(userId: UserId): IO[Option[UserProfile]] @@ -18,14 +16,14 @@ trait Profiles { object Profiles { final class Dummy extends Lifecycle.LiftF[IO, Profiles](for { - state <- IO.pure(TrieMap.empty[UserId, UserProfile]) + state <- Ref[IO].of(Map.empty[UserId, UserProfile]) } yield { new Profiles { override def setProfile(userId: UserId, profile: UserProfile): IO[Unit] = - IO.pure(state.update(userId, profile)) + state.update(_ + (userId -> profile)) override def getProfile(userId: UserId): IO[Option[UserProfile]] = - IO.pure(state.get(userId)) + state.get.map(_.get(userId)) } })