Skip to content

Instantly share code, notes, and snippets.

View ghostdogpr's full-sized avatar

Pierre Ricadat ghostdogpr

View GitHub Profile
import com.esotericsoftware.kryo.io.{Input, Output}
import com.twitter.chill.{KSerializer, Kryo}
import scala.runtime.LazyVals
import scala.runtime.LazyVals.LazyValControlState
class LazyValControlStateSerializer extends KSerializer[LazyValControlState] {
override def read(kryo: Kryo, input: Input, cls: Class[LazyValControlState]): LazyValControlState = {
kryo.readClassAndObject(input).asInstanceOf[LazyValControlState]
}
@ghostdogpr
ghostdogpr / Derivation.scala
Last active February 8, 2025 08:46
Sum Type Derivation
import scala.annotation.nowarn
import scala.deriving.Mirror
trait TC[A] {
def show(a: A): Unit
}
@nowarn
inline def gen[A](using m: Mirror.SumOf[A]): TC[A] = {
val subTypes = compiletime.summonAll[Tuple.Map[m.MirroredElemTypes, TC]]
@ghostdogpr
ghostdogpr / CodeGenerator.scala
Last active January 10, 2025 01:38
Code generation to create lenses
import java.nio.file.Path
import scala.meta.*
object CodeGenerator {
import dialects.Scala213Source3
private val emptyTree = "".parse[Source].get
def generateLenses(path: Path): String = {
val files = os.walk(os.Path(path)).toList.filterNot(os.isDir)
//> using dep dev.zio::zio:2.1.11
//> using dep dev.zio::zio-config-magnolia:4.0.2
//> using dep com.softwaremill.sttp.client3::zio:3.10.1
import sttp.client3.httpclient.zio.HttpClientZioBackend
import zio.*
import zio.config.derivation.name
import zio.config.magnolia.deriveConfig
type Language = String
@ghostdogpr
ghostdogpr / ox.sc
Last active June 28, 2024 06:25
Caliban + Ox demo
//> using dep com.github.ghostdogpr::caliban-tapir:2.8.0
//> using dep com.softwaremill.ox::core:0.2.2
//> using dep com.softwaremill.sttp.tapir::tapir-jsoniter-scala:1.10.10
//> using dep com.softwaremill.sttp.tapir::tapir-netty-server-sync:1.10.10
import caliban.*
import caliban.interop.tapir.*
import caliban.schema.Schema
import _root_.ox.*
import scala.concurrent.duration.*
@ghostdogpr
ghostdogpr / rbac.sc
Last active June 7, 2024 06:47
Role-based access control with Caliban
//> using dep com.github.ghostdogpr::caliban-quick:2.7.1
import caliban.*
import caliban.CalibanError.*
import caliban.Value.StringValue
import caliban.execution.FieldInfo
import caliban.parsing.adt.Directive
import caliban.quick.*
import caliban.schema.Annotations.*
import caliban.schema.Schema
[
{
"jmhVersion" : "1.37",
"benchmark" : "caliban.ComplexQueryBenchmark.runCaliban",
"mode" : "thrpt",
"threads" : 1,
"forks" : 1,
"jvm" : "/Users/pierre/Library/Java/JavaVirtualMachines/temurin-21.0.3/Contents/Home/bin/java",
"jvmArgs" : [
],
//> using dep com.github.ghostdogpr::caliban-quick:2.5.0
// 1. Defining the schema
enum Origin {
case EARTH, MARS, BELT
}
case class Character(name: String, nicknames: List[String], origin: Origin)
@ghostdogpr
ghostdogpr / caliban-cli.sc
Last active May 12, 2023 07:29
Test scala cli
//> using dep com.github.ghostdogpr::caliban:2.2.0
import caliban._
import caliban.schema._
case class Queries(books: List[Book]) derives Schema.SemiAuto
case class Book(id: Int, name: String) derives Schema.SemiAuto
val api = graphQL(RootResolver(Queries(Nil)))
@ghostdogpr
ghostdogpr / Derivation.scala
Created July 10, 2022 01:28
Infinite loop in function body
import scala.deriving.Mirror
import scala.compiletime._
trait Schema[T]
object Schema {
implicit val stringSchema: Schema[String] = new Schema[String] {}
implicit def listSchema[A](implicit ev: Schema[A]): Schema[List[A]] = new Schema[List[A]] {}
implicit def mapSchema[A, B](implicit evA: Schema[A], evB: Schema[B]): Schema[Map[A, B]] =
new Schema[Map[A, B]] {}