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.
*