diff --git a/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Bijection.kt b/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Bijection.kt index 0a1b0f65..a6a81291 100644 --- a/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Bijection.kt +++ b/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Bijection.kt @@ -9,6 +9,9 @@ class Bijection(val underlying: dev.typr.foundations.Bijection) { fun inverse(): Bijection = Bijection(underlying.inverse()) companion object { + fun of(forward: (A) -> B, backward: (B) -> A): Bijection = + Bijection(dev.typr.foundations.Bijection.of(forward, backward)) + internal fun optionalToNullable(): dev.typr.foundations.Bijection, T?> = dev.typr.foundations.Bijection.optionalToNullable() diff --git a/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Connection.kt b/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Connection.kt index 0f724e68..6b3e4e39 100644 --- a/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Connection.kt +++ b/foundations-jdbc-kotlin/src/kotlin/dev/typr/foundationskt/Connection.kt @@ -15,7 +15,7 @@ open class ConnectionRead(val underlying: dev.typr.foundations.ConnectionRead) { class Connection(private val java: dev.typr.foundations.Connection) : ConnectionRead(java) { - internal val javaConnection: dev.typr.foundations.Connection get() = java + val javaConnection: dev.typr.foundations.Connection get() = java fun execute(op: Operation): T = java.execute(op.underlying) diff --git a/foundations-jdbc/src/java/dev/typr/foundations/OperationRead.java b/foundations-jdbc/src/java/dev/typr/foundations/OperationRead.java index abdc24a5..e27920f0 100644 --- a/foundations-jdbc/src/java/dev/typr/foundations/OperationRead.java +++ b/foundations-jdbc/src/java/dev/typr/foundations/OperationRead.java @@ -17,11 +17,24 @@ public sealed interface OperationRead extends Operation OperationRead.Then, OperationRead.Configured { - /** Run this read operation on the given read connection. */ + /** Run this read operation on a read-only connection. */ default Out run(ConnectionRead conn) { return conn.execute(this); } + /** + * Re-declares the inherited {@link Operation#run(Connection)} on this trait so Scala 3's + * overload resolver sees both {@code run(Connection)} and {@code run(ConnectionRead)} declared + * at the same level — then specificity ({@code Connection <: ConnectionRead}) picks the more + * specific overload for {@code c: Connection} call sites without ambiguity. Java and Kotlin + * always picked the most-specific overload regardless; this redeclaration is purely for the + * Scala 3 overload resolver. Pure delegation; same body as the inherited default. + */ + @Override + default Out run(Connection conn) { + return conn.execute(this); + } + /** * Execute this operation using the given transactor. *