CoroutineName

scope.launch(CoroutineName("UpdateNews")) { 
  updateNews(view) 
}
Full Snapshot

Code

package com.glassthought.sandbox

import gt.sandbox.util.output.Out
import kotlinx.coroutines.*
import kotlin.random.Random

// Simulating a View interface for displaying data
interface View {
  suspend fun showNews(news: List<String>)
  suspend fun showUser(user: String)
  suspend fun showProgressBar()
  suspend fun hideProgressBar()
}

val out = Out.standard()

// A simple implementation of the View interface
class ConsoleView : View {
  override suspend fun showNews(news: List<String>) {
    out.printlnGreen("News: $news")
  }

  override suspend fun showUser(user: String) {
    out.printlnGreen("User: $user")
  }

  override suspend fun showProgressBar() {
    out.printlnBlue("Loading...")
  }

  override suspend fun hideProgressBar() {
    out.printlnBlue("Done loading.")
  }
}

// Simulated functions to fetch data
suspend fun getNewsFromApi(): List<String> {
  out.println("Starting news fetch...")
  delay(1000L) // Simulating network delay
  out.println("News fetch complete.")
  return listOf("News 1", "News 2", "News 3")
}

suspend fun getUserData(): String {
  out.println("Starting user data fetch...")
  delay(800L) // Simulating network delay
  out.println("User data fetch complete.")

  return "John Doe"
}


// Suspending functions to update news and profile
suspend fun updateNews(view: View) {
  view.showProgressBar()
  val news = getNewsFromApi()
  val sortedNews = news.sortedByDescending { Random.nextInt(1, 100) } // Simulated sorting
  view.showNews(sortedNews)
  view.hideProgressBar()
}

suspend fun updateProfile(view: View) {
  val user = getUserData()
  view.showUser(user)
}

// Main function
fun main() = runBlocking {
  out.println("Starting the program...")

  val view = ConsoleView()
  val scope = CoroutineScope(Dispatchers.Default)

  scope.launch(CoroutineName("UpdateNews")) {
    updateNews(view)
  }

  scope.launch(CoroutineName("UpdateProfile")) {
    updateProfile(view)
  }

  // Keep the program alive long enough to see the output
  delay(2000L)

  out.println("Program finished.")
}

Command to reproduce:

gt.sandbox.checkout.commit a22a14e145f6445dd1dc \
&& cd "${GT_SANDBOX_REPO}" \
&& cmd.run.announce "./gradlew run --quiet"

Recorded output of command:

[elapsed:   31ms][tname:main/tid:1][coroutine:unnamed] Starting the program...
[elapsed:   53ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] Loading...
[elapsed:   53ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] Starting news fetch...
[elapsed:   54ms][tname:DefaultDispatcher-worker-2/tid:21][coroutine:UpdateProfile] Starting user data fetch...
[elapsed:  859ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateProfile] User data fetch complete.
[elapsed:  864ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateProfile] User: John Doe
[elapsed: 1057ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] News fetch complete.
[elapsed: 1078ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] News: [News 3, News 2, News 1]
[elapsed: 1078ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] Done loading.
[elapsed: 2058ms][tname:main/tid:1][coroutine:unnamed] Program finished.