arrow-fx-coroutines / arrow.fx.coroutines / Resource / flatMap

flatMap

fun <B> flatMap(f: (A) -> Resource<B>): Resource<B>

Create a new resource B from a resource A by mapping f.

This is useful when you need to create a resource that depends on other resources.

import arrow.fx.coroutines.*

object Consumer
object DBHandle
data class DatabaseConsumer(val db: DBHandle, val consumer: Consumer)

fun consumer(): Resource<Consumer> = Resource({ Consumer }, { _ -> println("Closed consumer") })
fun dhHandle(): Resource<DBHandle> = Resource({ DBHandle }, { _ -> println("Closed db handle") })

suspend fun main(): Unit {
  //sampleStart
  consumer()
    .zip(dhHandle())
    .flatMap { (consumer, dbHandle) ->
      Resource(
        { DatabaseConsumer(dbHandle, consumer) },
        { _ -> println("Closed DatabaseConsumer") }
      )
    }.use { println("Expensive resource under use! $it") }
  //sampleEnd
}

Do you like Arrow?

Arrow Org
<