Skip to content

Instantly share code, notes, and snippets.

View ChristopherDavenport's full-sized avatar

Christopher Davenport ChristopherDavenport

View GitHub Profile
@ChristopherDavenport
ChristopherDavenport / davenverse-cs.json
Last active September 13, 2022 22:19
Curly Coursier Install
{
"curly4s": {
"repositories": [
"central"
],
"dependencies": [
"io.chrisdavenport::curly4s:latest.release"
]
},
"shellserve": {
@ChristopherDavenport
ChristopherDavenport / RateLimit.scala
Created October 15, 2021 18:27
Rate Limiting Agreements
// https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers
trait RateLimiter[F[_], K]{
def get(id: K): F[RateLimit]
def getAndDecrement(id: K): F[RateLimit]
def rateLimit(id: K): F[RateLimit] // Fails Request at this step, to be handled to 429 Too Many Requests and include a RetryAfter header
}
case class QuotaComment(token: String, value: Either[Long, String])
case class QuotaPolicy(limit: Long, timeWindowSeconds: Long, comments: List[QuotaComment])
@ChristopherDavenport
ChristopherDavenport / KeyPoolAdvanced.scala
Last active October 13, 2021 05:18
Advanced KeyPool with additional features and abilties.
import cats.syntax.all._
import org.typelevel.keypool._
import io.chrisdavenport.mapref._
import scala.concurrent.duration._
import cats.effect.kernel._
import scala.collection.immutable.Queue
object KeypoolAdvanced {
@ChristopherDavenport
ChristopherDavenport / EmojiEncoding.scala
Created September 20, 2021 23:13
Encode Emoji with Custom Embedding
import cats.syntax.all._
object EmojiEncoding {
private val range_min = 127744
private val range_max = 129782
private val range_min_2 = 126980
private val range_max_2 = 127569
private val range_min_3 = 169
@ChristopherDavenport
ChristopherDavenport / SingleFibered.scala
Last active September 17, 2021 23:15
Single Fibered Computation
import cats._
import cats.syntax.all._
import cats.data.Kleisli
import cats.effect._
import cats.effect.syntax._
import cats.effect.kernel.Outcome.Canceled
import cats.effect.kernel.Outcome.Errored
import cats.effect.kernel.Outcome.Succeeded
import java.util.concurrent.CancellationException
@ChristopherDavenport
ChristopherDavenport / Lock.scala
Last active October 11, 2021 13:10
Reentrant Lock
import cats._
import cats.syntax.all._
import cats.data._
import cats.effect._
import cats.effect.syntax.all._
import cats.effect.std.Semaphore
trait Lock[F[_]]{ self =>
def lock: F[Unit]
def unlock: F[Unit]
@ChristopherDavenport
ChristopherDavenport / IOLocalInvisibleTrace.scala
Last active September 1, 2021 21:58
IOLocal Based Invisible Trace
object Test extends ResourceApp.Simple {
def run = for {
ep <- Jaeger.entryPoint("server")(_ => IO(Configuration.fromEnv().getTracerBuilder().build()))
root <- ep.root("run")
ioLocal <- Resource.eval(IOLocal(root))
trace = MyTrace.fromIOLocal(ioLocal)
spanning = MyServer.ioTraceOverride(ep, ioLocal)
_ <- MyServer.inF(spanning)(Async[IO], trace)
} yield ()
@ChristopherDavenport
ChristopherDavenport / FiberLocalTracing.scala
Last active September 1, 2021 22:12
Full FiberLocal Tracing
object Test extends ResourceApp.Simple {
def run = for {
ep <- Resource.eval(
Jaeger.globalTracerEntryPoint[IO](None).flatMap(_.toRight(new Throwable("No Global")).liftTo[IO])
)
root <- ep.root("run")
fiberLocal <- Resource.eval(GenFiberLocal[IO].local(root))
trace = MyTrace.fromFiberLocal(fiberLocal)
spanning = MyServer.myMiddleware(ep, fiberLocal)
@ChristopherDavenport
ChristopherDavenport / FiberLocal.scala
Created September 1, 2021 18:18
Fiber Local Basic Implementation
trait FiberLocal[F[_], A]{
def get: F[A]
def set(value: A): F[Unit]
def reset: F[Unit]
def update(f: A => A): F[Unit]
@ChristopherDavenport
ChristopherDavenport / EmberRetryFix.scala
Created August 11, 2021 23:12
This is what we can use to fix EndOfStream errors for ember
object EmberRetryFix {
import cats.syntax.all._
import scala.concurrent.duration._
import org.http4s._
import org.http4s.client._
import org.http4s.ember.core.EmberException
import org.http4s.client.middleware._
import org.http4s.headers.`Idempotency-Key`