Skip to content

Instantly share code, notes, and snippets.

@tonisives
Created September 5, 2023 08:32
Show Gist options
  • Save tonisives/e94ebe84e1f18ca84b98848b064dfe53 to your computer and use it in GitHub Desktop.
Save tonisives/e94ebe84e1f18ca84b98848b064dfe53 to your computer and use it in GitHub Desktop.
Arrow with test
// plugins {
// id "org.jetbrains.kotlin.jvm" version "1.9.0"
// implementation("io.arrow-kt:arrow-core:1.2.0")
// implementation("io.arrow-kt:arrow-optics:1.2.0")
// ksp("io.arrow-kt:arrow-optics-ksp-plugin:1.2.0")
package test
import io.sentry.protocol.User
import javax.management.Query
data class ConnectionParams(val host: String, val port: Int)
class Connection
class DatabaseConnection {
suspend fun <A> execute(q: Query): Result<A> {
return Result.success(null) as Result<A>
}
}
interface Logger {
suspend fun log(message: String): Unit
}
interface Database {
suspend fun <A> execute(q: Query): Result<A>
}
suspend fun openDatabaseConnection(params: ConnectionParams): Connection {
return Connection()
}
class DatabaseFromConnection(val conn: DatabaseConnection) : Database {
override suspend fun <A> execute(q: Query): Result<A> =
conn.execute(q)
}
interface Log {
suspend fun log(message: String): Unit
}
suspend fun <Ctx> Ctx.saveUserInDb(user: String)
where Ctx : Database, Ctx : Log {
// prepare something
val result = execute<String>(Query())
if (result.isFailure) log("Big problem!")
// keep doing stuff
}
suspend fun <A : Any> db(
params: ConnectionParams,
f: suspend Database.() -> A
): A {
val conn = openDatabaseConnection(params) as DatabaseConnection
return with(DatabaseFromConnection(conn), f)
}
class StdOutLogger() : Logger {
override suspend fun log(message: String) {
println(message)
}
}
fun <A : Any> stdoutLogger(
f: suspend Logger.() -> A
): A {
return with(StdOutLogger(), f)
}
val connParams = ConnectionParams("localhost", 1234)
suspend fun example() {
db(connParams) {
stdoutLogger {
with(object : Database by this@db, Logger as this@stdoutLogger) {
saveUserInDb(User("Alex"))
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment