diff --git a/build.sbt b/build.sbt index de28a2f..9157699 100644 --- a/build.sbt +++ b/build.sbt @@ -18,12 +18,12 @@ ThisBuild / versionScheme := Some("early-semver") ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("11")) -val catsV = "2.9.0" -val catsEffectV = "3.4.9" -val catsCollectionV = "0.9.6" +val catsV = "2.11.0" +val catsEffectV = "3.6.0" +val catsCollectionV = "0.9.9" -val munitV = "1.0.0-M7" -val munitCEV = "2.0.0-M3" +val munitV = "1.0.0" +val munitCEV = "2.0.0" lazy val mules = tlCrossRootProject .aggregate(core, caffeine, reload, noop, bench) @@ -57,7 +57,7 @@ lazy val caffeine = project .settings( name := "mules-caffeine", libraryDependencies ++= Seq( - "com.github.ben-manes.caffeine" % "caffeine" % "3.1.6" + "com.github.ben-manes.caffeine" % "caffeine" % "3.2.0" ) ) .settings(testDeps) @@ -95,7 +95,7 @@ lazy val testDeps = Seq( libraryDependencies ++= Seq( "org.typelevel" %%% "cats-effect-laws" % catsEffectV % Test, "org.scalameta" %%% "munit" % munitV % Test, - "org.scalameta" %%% "munit-scalacheck" % munitV % Test, + "org.scalameta" %%% "munit-scalacheck" % "1.0.0-M11" % Test, "org.typelevel" %%% "munit-cats-effect" % munitCEV % Test ) ) diff --git a/modules/core/src/main/scala/io/chrisdavenport/mules/DispatchOneCache.scala b/modules/core/src/main/scala/io/chrisdavenport/mules/DispatchOneCache.scala index ca9ff60..4b559a9 100644 --- a/modules/core/src/main/scala/io/chrisdavenport/mules/DispatchOneCache.scala +++ b/modules/core/src/main/scala/io/chrisdavenport/mules/DispatchOneCache.scala @@ -27,7 +27,7 @@ import cats.implicits._ import scala.collection.immutable.Map import cats.effect.std.MapRef -import cats.effect.std.MapRef.fromSeqRefs +import cats.data.NonEmptySeq import java.util.concurrent.ConcurrentHashMap import scala.collection.mutable @@ -424,11 +424,20 @@ private[mules] object PurgeableMapRef { def purgeExpiredEntries(shards: List[Ref[F, Map[K, V]]])(now: Long) = shards.parFlatTraverse(SingleRef.purgeExpiredEntries(_, isExpired)(now)) - shards.map { s => - PurgeableMapRef( - fromSeqRefs(s), - purgeExpiredEntries(s) - ) + shards.flatMap { s => + NonEmptySeq.fromSeq(s) match { + case Some(nonEmptyShards) => + Concurrent[F].pure( + PurgeableMapRef( + MapRef.fromNonEmptySeqRefs(nonEmptyShards), + purgeExpiredEntries(nonEmptyShards.toList) + ) + ) + case None => + Concurrent[F].raiseError( + new IllegalArgumentException("shards must be non-empty") + ) + } } } diff --git a/project/plugins.sbt b/project/plugins.sbt index 2f449e2..da4d65b 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,7 +1,7 @@ -addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.4") +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.7") addSbtPlugin("org.typelevel" % "sbt-typelevel" % "0.7.7") addSbtPlugin("org.typelevel" % "sbt-typelevel-site" % "0.7.7") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.18.2") -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.3.0") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.3.2") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.17") -addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.3.0") +addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.3.2")