Created
September 5, 2023 08:32
-
-
Save tonisives/e94ebe84e1f18ca84b98848b064dfe53 to your computer and use it in GitHub Desktop.
Arrow with test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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