Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Cats Effect IO type inference #2459

Merged
merged 4 commits into from
Jul 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -189,13 +189,13 @@ lazy val clientsSniffed = (project in file("elastic4s-client-sniffed"))
.settings(libraryDependencies ++= Seq(elasticsearchRestClientSniffer))

lazy val cats_effect = (project in file("elastic4s-effect-cats"))
.dependsOn(core)
.dependsOn(core, testkit % "test")
.settings(name := "elastic4s-effect-cats")
.settings(allSettings)
.settings(libraryDependencies += cats)

lazy val cats_effect_2 = (project in file("elastic4s-effect-cats-2"))
.dependsOn(core)
.dependsOn(core, testkit % "test")
.settings(name := "elastic4s-effect-cats-2")
.settings(allSettings)
.settings(libraryDependencies += cats2)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sksamuel.elastic4s.cats.effect.instances

import cats.effect.Async
import cats.effect.{Async, IO}
import cats.{Functor => CatsFunctor}
import com.sksamuel.elastic4s.cats.effect.CatsEffectExecutor
import com.sksamuel.elastic4s.{Executor, Functor}
Expand All @@ -12,6 +12,9 @@ trait CatsEffectInstances {

implicit def catsEffectExecutor[F[_]: Async]: Executor[F] =
new CatsEffectExecutor[F]

//this needs to be at the bottom
yangzai marked this conversation as resolved.
Show resolved Hide resolved
implicit val ioExecutor: Executor[IO] = new CatsEffectExecutor[IO]
}

@deprecated("Use CatsEffectInstances instead")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.sksamuel.elastic4s.cats.effect

import cats.data.OptionT
import cats.effect.IO
import com.sksamuel.elastic4s.{ElasticClient, ElasticProperties}
import com.sksamuel.elastic4s.ElasticDsl._
import org.scalatest.flatspec.AnyFlatSpec
import com.sksamuel.elastic4s.cats.effect.instances._
import com.sksamuel.elastic4s.http.JavaClient
import com.sksamuel.elastic4s.requests.indexes.admin.DeleteIndexResponse
import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexResponse, DeleteIndexRequest}

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

class CatsEffectTest extends AnyFlatSpec {
yangzai marked this conversation as resolved.
Show resolved Hide resolved
type OptionIO[A] = OptionT[IO, A]

val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy")))
val index = "index"

"ElasticClient#execute" should "compile and infer effect type as `IO`" in {
for {
r1 <- client.execute(createIndex(index))
_ <- IO(println(r1))
r2 <- client.execute(deleteIndex(index))
_ <- IO(println(r2))
} yield (r1, r2)
}

it should "still compile with other Cats `Async` instances with explicit type annotations" in {
for {
r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex(index))
_ <- IO(println(r1)).to[OptionIO]
r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex(index))
_ <- IO(println(r2)).to[OptionIO]
} yield (r1, r2)
}

it should "still compile with `Future` with explicit type annotations" in {
for {
r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, Future](createIndex(index))
_ <- Future(println(r1))
r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, Future](deleteIndex(index))
_ <- Future(println(r2))
} yield (r1, r2)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sksamuel.elastic4s.cats.effect.instances

import cats.effect.Async
import cats.effect.{Async, IO}
import cats.{Functor => CatsFunctor}
import com.sksamuel.elastic4s.cats.effect.CatsEffectExecutor
import com.sksamuel.elastic4s.{Executor, Functor}
Expand All @@ -12,6 +12,9 @@ trait CatsEffectInstances {

implicit def catsEffectExecutor[F[_]: Async]: Executor[F] =
new CatsEffectExecutor[F]

//this needs to be at the bottom
implicit val ioExecutor: Executor[IO] = new CatsEffectExecutor[IO]
}

@deprecated("Use CatsEffectInstances instead")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.sksamuel.elastic4s.cats.effect

import cats.data.OptionT
import cats.effect.IO
import com.sksamuel.elastic4s.{ElasticClient, ElasticProperties}
import com.sksamuel.elastic4s.ElasticDsl._
import org.scalatest.flatspec.AnyFlatSpec
import com.sksamuel.elastic4s.cats.effect.instances._
import com.sksamuel.elastic4s.http.JavaClient
import com.sksamuel.elastic4s.requests.indexes.admin.DeleteIndexResponse
import com.sksamuel.elastic4s.requests.indexes.{CreateIndexRequest, CreateIndexResponse, DeleteIndexRequest}

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

class CatsEffectTest extends AnyFlatSpec {
type OptionIO[A] = OptionT[IO, A]

val client: ElasticClient = ElasticClient(JavaClient(ElasticProperties("http://dummy")))
val index = "index"

"ElasticClient#execute" should "compile and infer effect type as `IO`" in {
for {
r1 <- client.execute(createIndex(index))
_ <- IO(println(r1))
r2 <- client.execute(deleteIndex(index))
_ <- IO(println(r2))
} yield (r1, r2)
}

it should "still compile with other Cats `Async` instances with explicit type annotations" in {
for {
r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, OptionIO](createIndex(index))
_ <- IO(println(r1)).to[OptionIO]
r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, OptionIO](deleteIndex(index))
_ <- IO(println(r2)).to[OptionIO]
} yield (r1, r2)
}

it should "still compile with `Future` with explicit type annotations" in {
for {
r1 <- client.execute[CreateIndexRequest, CreateIndexResponse, Future](createIndex(index))
_ <- Future(println(r1))
r2 <- client.execute[DeleteIndexRequest, DeleteIndexResponse, Future](deleteIndex(index))
_ <- Future(println(r2))
} yield (r1, r2)
}
}