Skip to content

Instantly share code, notes, and snippets.

View adamw's full-sized avatar

Adam Warski adamw

View GitHub Profile
@adamw
adamw / sttp3.scala
Last active October 15, 2019 16:25
import cats.effect.{ContextShift, IO, Timer}
import org.asynchttpclient.ws.{WebSocket, WebSocketListener}
import sttp.client._
import sttp.client.asynchttpclient.WebSocketHandler
import sttp.client.ws.WebSocketResponse
import scala.concurrent.ExecutionContext.global
import scala.concurrent.duration._
object CatsWebsocketExample extends App {
@adamw
adamw / sttp2.scala
Last active October 15, 2019 16:24
package sttp.client.akkahttp
import akka.Done
import akka.actor.{ActorSystem, Cancellable}
import akka.http.scaladsl.model.ws.{Message, TextMessage}
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Flow, Keep, Sink, Source}
import akka.util.ByteString
import sttp.client._
import sttp.client.ws.WebSocketResponse
trait SttpBackend[F[_], -S, -WS_HANDLER[_]] {
def send[T](request: Request[T, S]): F[Response[T]]
def openWebsocket[T, WS_RESULT](
request: Request[T, S],
handler: WS_HANDLER[WS_RESULT]): F[WebSocketResponse[WS_RESULT]]
def close(): F[Unit]
def responseMonad: MonadError[F]
}
@adamw
adamw / t11.scala
Last active September 20, 2019 06:19
val countPersons: ConnectionIO[Int] =
sql"SELECT COUNT(*) FROM persons".query[Int].unique
val callFromCount: ConnectionIO[IO[Unit]] = countPersons.map { count =>
if (count == 0) IO(println("No users!")) else IO(println(s"Found $count users"))
}
val showResults: IO[Unit] = callFromCount.transact(transactor).flatten
showResults.unsafeRunSync()
@adamw
adamw / t10.scala
Last active September 20, 2019 06:18
val insertEventQuery: ConnectionIO[Int] =
sql"INSERT INTO events(msg) VALUES('made a http call')".update.run
val result: IO[Int] = queryFromHttpCall
.map(countQuery => insertEventQuery >> countQuery)
.flatMap(_.transact(transactor))
@adamw
adamw / t9.scala
Created September 19, 2019 16:14
val httpCall: IO[String] = IO("Zoe")
val queryFromHttpCall: IO[ConnectionIO[Int]] =
httpCall.map { name =>
sql"SELECT COUNT(*) FROM persons WHERE name = $name".query[Int].unique
}
@adamw
adamw / t8.scala
Last active September 20, 2019 06:18
val insertUserInTx: IO[Int] = insertUser.transact(transactor)
// (2) BEGIN; INSERT; COMMIT; sendEmail();
val result2: IO[Unit] = insertUserInTx.flatMap(_ => sendEmail)
// (3) sendEmail(); BEGIN; INSERT; COMMIT;
val result3: IO[Int] = sendEmail.flatMap(_ => insertUserInTx)
@adamw
adamw / t7.scala
Last active September 20, 2019 06:19
// Re-useable effect descriptions
val sendEmail: IO[Unit] = IO(println("Sending email"))
val insertUser: ConnectionIO[Int] =
sql"INSERT INTO users(name, email) VALUES('Emily', '[email protected]')"
.update.run
// (1) BEGIN; INSERT; sendEmail(); COMMIT;
val insertThenSend: ConnectionIO[Unit] =
insertUser.flatMap(_ => sendEmail.to[ConnectionIO])
@adamw
adamw / t6.scala
Last active September 20, 2019 06:18
val sendEmail: IO[Unit] = IO(println("Sending email"))
val sendEmailWithConnection: ConnectionIO[Unit] =
sendEmail.to[ConnectionIO]
val sendEmailInTx: IO[Unit] = sendEmailWithConnection.transact(transactor)
@adamw
adamw / t5.sql
Last active September 20, 2019 07:21
(1) BEGIN; INSERT; sendEmail(); COMMIT;
(2) BEGIN; INSERT; COMMIT; sendEmail();
(3) sendEmail(); BEGIN; INSERT; COMMIT;
(4) BEGIN; sendEmail(); INSERT; COMMIT;