Exemples Kotlin

Exemples de code Kotlin essentiels pour le développement Android, backend JVM et les fonctionnalités modernes de Kotlin

💻 Hello World Kotlin kotlin

🟢 simple

Programme Hello World de base avec syntaxe moderne Kotlin et sécurité des types

⏱️ 10 min 🏷️ kotlin, jvm, null safety
Prerequisites: Basic programming concepts
// Kotlin Hello World Examples

// 1. Basic Hello World
fun main() {
    println("Hello, World!")
}

// 2. Hello World with variable
fun main() {
    val message = "Hello, World!"
    println(message)
}

// 3. Hello World with function
fun sayHello(): String {
    return "Hello, World!"
}

fun main() {
    println(sayHello())
}

// 4. Hello World with parameters
fun greet(name: String): String {
    return "Hello, \$name!"
}

fun main() {
    println(greet("World"))
    println(greet("Kotlin"))
}

// 5. Hello World with class
class Greeter(private val message: String = "Hello, World!") {
    fun greet() {
        println(message)
    }
}

fun main() {
    val greeter = Greeter()
    greeter.greet()
}

// 6. Hello World with user input
fun main() {
    print("Enter your name: ")
    val name = readLine()
    println("Hello, ${name ?: "World"}!")
}

// 7. Hello World multiple times
fun main() {
    for (i in 1..5) {
        println("Hello, World! $i")
    }
}

// 8. Hello World with collection
fun main() {
    val greetings = listOf("Hello", "Bonjour", "Hola", "Ciao", "こんにちは")
    greetings.forEach { greeting ->
        println("\$greeting, World!")
    }
}

// 9. Hello World with map
fun main() {
    val greetings = mapOf(
        "en" to "Hello",
        "es" to "Hola",
        "fr" to "Bonjour",
        "de" to "Hallo",
        "ja" to "こんにちは"
    )

    greetings.forEach { (lang, greeting) ->
        println("\$greeting, World! (\$lang)")
    }
}

// 10. Hello World with data class
data class HelloResponse(
    val message: String,
    val timestamp: Long = System.currentTimeMillis(),
    val success: Boolean = true
)

fun main() {
    val response = HelloResponse("Hello, World!")
    println(response)
}

// Basic data types examples
fun main() {
    // Kotlin is statically typed with type inference
    val integer: Int = 42
    val double: Double = 3.14
    val float: Float = 3.14f
    val long: Long = 42L
    val string: String = "Hello, Kotlin!"
    val boolean: Boolean = true
    val char: Char = 'K'
    val array: Array<Int> = arrayOf(1, 2, 3, 4, 5)
    val list: List<Int> = listOf(1, 2, 3, 4, 5)
    val map: Map<String, Any> = mapOf(
        "name" to "John Doe",
        "age" to 30,
        "email" to "[email protected]"
    )
    val nullable: String? = null

    println("Integer: $integer, Type: ${integer::class.simpleName}")
    println("Double: $double, Type: ${double::class.simpleName}")
    println("Float: $float, Type: ${float::class.simpleName}")
    println("Long: $long, Type: ${long::class.simpleName}")
    println("String: $string, Type: ${string::class.simpleName}")
    println("Boolean: $boolean, Type: ${boolean::class.simpleName}")
    println("Char: $char, Type: ${char::class.simpleName}")
    println("Array: ${array.contentToString()}, Type: ${array::class.simpleName}")
    println("List: $list, Type: ${list::class.simpleName}")
    println("Map: $map, Type: ${map::class.simpleName}")
    println("Nullable: ${nullable ?: "null"}, Type: ${nullable?.let { it::class.simpleName } ?: "Null"}")

    // Control flow examples
    val age = 18
    if (age >= 18) {
        println("You are an adult")
    } else {
        println("You are a minor")
    }

    // When expression (Kotlin's switch)
    val grade = 'A'
    when (grade) {
        'A' -> println("Excellent!")
        'B' -> println("Good job!")
        'C' -> println("Fair enough")
        else -> println("Need improvement")
    }

    // Loop examples
    val fruits = listOf("apple", "banana", "cherry")
    for (index, fruit) in fruits.withIndex()) {
        println("${index + 1}. I like $fruit")
    }

    // Range operations
    for (i in 1..10) {
        println("Number: $i")
    }

    // Collection operations examples
    val numbers = (1..10).toList()
    val evenNumbers = numbers.filter { it % 2 == 0 }
    val squaredNumbers = numbers.map { it * it }
    val sum = numbers.reduce { acc, num -> acc + num }

    println("Even numbers: $evenNumbers")
    println("Squared numbers: $squaredNumbers")
    println("Sum: $sum")

    // String methods examples
    val text = "Hello, Kotlin Programming!"
    println("Uppercase: ${text.uppercase()}")
    println("Lowercase: ${text.lowercase()}")
    println("Capitalized: ${text.replaceFirstChar { it.uppercase() }}")
    println("Length: ${text.length}")
    println("Reversed: ${text.reversed()}")

    // Null safety examples
    val nullableString: String? = "NotNull"
    val length = nullableString?.length ?: 0
    println("Length: $length")

    val definitelyNotNull: String = nullableString!!
    println("Not null: $definitelyNotNull")

    // Elvis operator
    val result = nullableString ?: "Default value"
    println("Result: \$result")

    // Safe call with let
    nullableString?.let {
        println("Value exists: $it")
    }

    // Method chaining with scope functions
    val processedText = text
        .split(" ")
        .filter { it.isNotBlank() }
        .map { it.lowercase() }
        .joinToString("-")

    println("Processed text: \$processedText")
}

💻 Programmation Orientée Objet Kotlin kotlin

🟡 intermediate ⭐⭐⭐⭐

Concepts OOP avancés incluant classes, héritage, interfaces et fonctionnalités spécifiques à Kotlin

⏱️ 35 min 🏷️ kotlin, oop, advanced
Prerequisites: Basic Kotlin syntax, Object-oriented concepts
// Kotlin Object-Oriented Programming Examples

// 1. Classes and Properties
class Person(
    val name: String,           // Read-only property
    var age: Int,              // Mutable property
    private var _email: String = ""  // Private property with backing field
) {
    // Custom getter
    var email: String
        get() = _email
        set(value) {
            if (value.contains("@")) {
                _email = value
            }
        }

    // Custom getter with derived property
    val isAdult: Boolean
        get() = age >= 18

    // Secondary constructor
    constructor(name: String) : this(name, 0)

    // Member function
    fun introduce(): String {
        return "Hi, I'm \$name and I'm \$age years old."
    }

    // Init block
    init {
        println("Person \$name created")
    }
}

// 2. Data Classes
data class User(
    val id: Long,
    val username: String,
    val email: String,
    val isActive: Boolean = true
) {
    // Custom component in data class
    val displayName: String
        get() = username.replaceFirstChar { it.uppercase() }
}

fun demonstrateDataClass() {
    val user1 = User(1, "john_doe", "[email protected]")
    val user2 = user1.copy(username = "jane_doe", id = 2)

    println("User 1: $user1")
    println("User 2: $user2")
    println("Display names: ${user1.displayName}, ${user2.displayName}")
}

// 3. Sealed Classes and Enums
sealed class Result<out T> {
    data class Success<out T>(val data: T) : Result<T>()
    data class Error(val exception: Throwable) : Result<Nothing>()
    object Loading : Result<Nothing>()
}

enum class Status {
    ACTIVE, INACTIVE, PENDING, COMPLETED;

    fun isFinal(): Boolean {
        return this == COMPLETED
    }

    companion object {
        fun fromString(value: String): Status? {
            return values().find { it.name.equals(value, ignoreCase = true) }
        }
    }

    val displayName: String
        get() = name.lowercase().replaceFirstChar { it.uppercase() }
}

// 4. Interfaces
interface Drawable {
    fun draw()
    val area: Double
}

interface Movable {
    fun move(dx: Double, dy: Double)
}

// Multiple interface implementation
class Circle(
    private var radius: Double,
    private var x: Double = 0.0,
    private var y: Double = 0.0
) : Drawable, Movable {

    init {
        require(radius > 0) { "Radius must be positive" }
    }

    override val area: Double
        get() = Math.PI * radius * radius

    override fun draw() {
        println("Drawing circle at ($x, $y) with radius $radius")
    }

    override fun move(dx: Double, dy: Double) {
        x += dx
        y += dy
        println("Circle moved to ($x, $y)")
    }

    // Property with custom setter
    var diameter: Double
        get() = radius * 2
        set(value) {
            radius = value / 2
        }
}

// 5. Inheritance
abstract class Animal(
    protected val name: String,
    protected val age: Int
) {
    abstract fun makeSound()

    fun eat(): String {
        return "\$name is eating"
    }
}

class Dog(
    name: String,
    age: Int,
    val breed: String
) : Animal(name, age) {

    override fun makeSound() {
        println("\$name barks: Woof!")
    }

    fun wagTail() {
        println("\$name is wagging its tail")
    }

    // Property with custom getter
    val isPuppy: Boolean
        get() = age < 1
}

class Cat(
    name: String,
    age: Int,
    var color: String
) : Animal(name, age) {

    override fun makeSound() {
        println("\$name meows: Meow!")
    }

    fun purr() {
        println("\$name is purring")
    }

    override fun eat(): String {
        return super.eat() + " cat food"
    }
}

// 6. Abstract Class with Factory Pattern
abstract class Vehicle {
    abstract val brand: String
    abstract val model: String
    abstract val year: Int

    abstract fun start()
    abstract fun stop()

    fun info(): String {
        return "\$year \$brand \$model"
    }

    companion object {
        fun createCar(brand: String, model: String, year: Int): Car {
            return Car(brand, model, year)
        }

        fun createMotorcycle(brand: String, model: String, year: Int): Motorcycle {
            return Motorcycle(brand, model, year)
        }
    }
}

class Car(
    override val brand: String,
    override val model: String,
    override val year: Int,
    val numberOfDoors: Int = 4
) : Vehicle() {

    override fun start() {
        println("\$brand \$model engine started")
    }

    override fun stop() {
        println("\$brand \$model engine stopped")
    }

    fun openTrunk() {
        println("Trunk opened")
    }
}

class Motorcycle(
    override val brand: String,
    override val model: String,
    override val year: Int,
    val hasStorage: Boolean = false
) : Vehicle() {

    override fun start() {
        println("\$brand \$model engine started")
    }

    override fun stop() {
        println("\$brand \$model engine stopped")
    }

    fun wheelie() {
        println("Doing a wheelie!")
    }
}

// 7. Object (Singleton)
object Database {
    private val connections = mutableListOf<String>()

    fun addConnection(connectionString: String) {
        connections.add(connectionString)
        println("Added connection: $connectionString")
    }

    fun getConnectionCount(): Int {
        return connections.size
    }

    fun clearConnections() {
        connections.clear()
        println("All connections cleared")
    }
}

// 8. Companion Object (Factory methods)
class HttpClient private constructor(
    private val baseUrl: String,
    private val timeout: Int
) {
    fun get(endpoint: String): String {
        return "GET $baseUrl$endpoint"
    }

    companion object {
        fun createDefault(): HttpClient {
            return HttpClient("https://api.example.com", 30)
        }

        fun createCustom(baseUrl: String, timeout: Int): HttpClient {
            return HttpClient(baseUrl, timeout)
        }
    }
}

// 9. Extension Functions
fun String.isEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

fun String.capitalizeWords(): String {
    return this.split(" ")
        .joinToString(" ") { it.replaceFirstChar { it.uppercase() } }
}

fun Int.isEven(): Boolean = this % 2 == 0

fun List<Int>.sumOfSquares(): Int = this.map { it * it }.sum()

// Extension properties
val String.isValidPassword: Boolean
    get() = this.length >= 8 && this.any { it.isUpperCase() } && this.any { it.isDigit() }

// 10. Generic Classes
class Stack<T>(private vararg val items: T) {
    private val elements = mutableListOf(*items)

    fun push(item: T) {
        elements.add(item)
    }

    fun pop(): T? {
        return if (elements.isNotEmpty()) {
            elements.removeAt(elements.size - 1)
        } else {
            null
        }
    }

    fun peek(): T? {
        return elements.lastOrNull()
    }

    val size: Int
        get() = elements.size

    val isEmpty: Boolean
        get() = elements.isEmpty()

    fun <R> map(transform: (T) -> R): Stack<R> {
        return Stack<R>(*elements.map(transform).toTypedArray())
    }
}

// 11. Delegation
interface Logger {
    fun log(message: String)
    fun error(message: String)
}

class ConsoleLogger : Logger {
    override fun log(message: String) {
        println("LOG: $message")
    }

    override fun error(message: String) {
        println("ERROR: $message")
    }
}

class FileLogger : Logger {
    private val filename = "app.log"

    override fun log(message: String) {
        // Write to file
        println("FILE LOG: $message")
    }

    override fun error(message: String) {
        // Write error to file
        println("FILE ERROR: $message")
    }
}

// Delegated logger
class UserService(
    private val logger: Logger
) : Logger by logger {

    fun createUser(name: String, email: String): User {
        log("Creating user: $name")

        // Simulate user creation
        val user = User(
            id = System.currentTimeMillis(),
            username = name.lowercase().replace(" ", "_"),
            email = email
        )

        log("User created with ID: ${user.id}")
        return user
    }

    fun deleteUser(userId: Long) {
        error("User deletion requested for ID: $userId")
        // Delete user logic here
    }
}

// 12. Scope Functions
fun demonstrateScopeFunctions() {
    // apply: used for object configuration
    val person = Person("Alice", 25).apply {
        age = 26
        email = "[email protected]"
    }

    // let: executes block on non-null object and returns result
    val result = person.let {
        "User: ${it.name}, Age: ${it.age}"
    }

    // run: similar to let but for object and returns any type
    val userStatus = person.run {
        when {
            isAdult -> "Adult"
            age < 13 -> "Child"
            else -> "Teenager"
        }
    }

    // also: similar to apply but returns object (for chaining)
    val configuredPerson = person.also {
        println("Configured person: \${it.name}")
    }

    println("Result: \$result")
    println("Status: \$userStatus")
    println("Final person: \${configuredPerson.name}")
}

// Main function demonstrating all concepts
fun main() {
    // Data class demo
    demonstrateDataClass()

    // Sealed class demo
    val result1: Result<String> = Result.Success("Data loaded successfully")
    val result2: Result<String> = Result.Error(Exception("Network error"))

    when (result1) {
        is Result.Success -> println("Success: ${result1.data}")
        is Result.Error -> println("Error: ${result2.exception.message}")
        is Result.Loading -> println("Loading...")
    }

    // Inheritance demo
    val dog = Dog("Buddy", 3, "Golden Retriever")
    val cat = Cat("Whiskers", 2, "gray")

    dog.makeSound()
    dog.wagTail()
    cat.makeSound()
    cat.purr()

    // Vehicle factory demo
    val car = Vehicle.createCar("Toyota", "Camry", 2022)
    val motorcycle = Vehicle.createMotorcycle("Harley", "Davidson", 2021)

    car.start()
    car.openTrunk()
    motorcycle.start()
    motorcycle.wheelie()

    // Singleton demo
    Database.addConnection("localhost:5432")
    Database.addConnection("remote:5432")
    println("Total connections: ${Database.getConnectionCount()}")

    // Extension functions demo
    val email = "[email protected]"
    val words = "hello world kotlin programming"
    val numbers = listOf(1, 2, 3, 4, 5)

    println("Is email: ${email.isEmail()}")
    println("Capitalized: ${words.capitalizeWords()}")
    println("Even numbers count: ${numbers.count { it.isEven() }}")
    println("Sum of squares: ${numbers.sumOfSquares()}")
    println("Password valid: ${"Password123".isValidPassword}")

    // Generic stack demo
    val intStack = Stack(1, 2, 3)
    intStack.push(4)
    println("Popped: ${intStack.pop()}")
    println("Stack size: ${intStack.size}")

    // Delegation demo
    val consoleLogger = ConsoleLogger()
    val userService = UserService(consoleLogger)
    val user = userService.createUser("John Doe", "[email protected]")
    userService.deleteUser(user.id)

    // Scope functions demo
    demonstrateScopeFunctions()
}

💻 Coroutines et Concurrence Kotlin kotlin

🔴 complex ⭐⭐⭐⭐⭐

Coroutines modernes Kotlin pour programmation asynchrone, concurrence structurée et traitement parallèle

⏱️ 50 min 🏷️ kotlin, coroutines, async, parallel
Prerequisites: Advanced Kotlin, Concurrency concepts, Kotlin coroutines library
// Kotlin Coroutines and Concurrency Examples

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.*
import kotlin.random.Random
import kotlin.system.measureTimeMillis

// 1. Basic Coroutine Launch
fun basicCoroutineExample() = runBlocking {
    println("Start")

    // Launch a new coroutine
    launch {
        delay(1000) // Non-blocking delay
        println("Inside launch")
    }

    println("End of runBlocking")
}

// 2. Async/Await Pattern
suspend fun fetchUserData(): User {
    delay(1000) // Simulate network call
    return User(
        id = Random.nextLong(),
        username = "user_${Random.nextInt()}",
        email = "user${Random.nextInt()}@example.com"
    )
}

fun asyncAwaitExample() = runBlocking {
    val time = measureTimeMillis {
        // Launch multiple async operations
        val deferred1 = async { fetchUserData() }
        val deferred2 = async { fetchUserData() }
        val deferred3 = async { fetchUserData() }

        // Wait for all results
        val user1 = deferred1.await()
        val user2 = deferred2.await()
        val user3 = deferred3.await()

        println("Users fetched: ${user1.username}, ${user2.username}, ${user3.username}")
    }

    println("Total time: $time ms")
}

// 3. Coroutine Contexts and Dispatchers
fun dispatchersExample() = runBlocking {
    // Main thread
    println("Main thread: ${Thread.currentThread().name}")

    launch(Dispatchers.Default) {
        // Background thread for CPU-intensive work
        println("Background thread: ${Thread.currentThread().name}")
        val result = (1..1_000_000).map { it * 2 }.sum()
        println("Computation result: $result")
    }

    launch(Dispatchers.IO) {
        // I/O thread for blocking operations
        println("IO thread: ${Thread.currentThread().name}")
        Thread.sleep(1000) // Simulate blocking I/O
        println("I/O operation completed")
    }

    delay(2000) // Wait for background work
}

// 4. Structured Concurrency with SupervisorJob
fun structuredConcurrencyExample() = runBlocking {
    val supervisorJob = SupervisorJob()

    with(CoroutineScope(supervisorJob)) {
        launch {
            delay(1000)
            println("Child 1 completed")
            throw Exception("Child 1 failed") // This won't affect other children
        }

        launch {
            delay(1500)
            println("Child 2 completed")
        }

        launch {
            delay(2000)
            println("Child 3 completed")
        }
    }

    println("Parent scope completed")
}

// 5. Coroutine Scopes and Contexts
class UserRepository {
    private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)

    suspend fun loadUsers(): List<User> = withContext(Dispatchers.IO) {
        delay(1000)
        (1..5).map {
            User(it.toLong(), "user$it", "[email protected]")
        }
    }

    fun refreshUsers(onComplete: (List<User>) -> Unit) {
        scope.launch {
            val users = loadUsers()
            onComplete(users)
        }
    }

    fun cleanup() {
        scope.cancel()
    }
}

// 6. Channels for Coroutine Communication
fun channelExample() = runBlocking {
    val channel = Channel<Int>(10)

    // Producer coroutine
    val producer = launch {
        for (i in 1..10) {
            channel.send(i)
            println("Sent: $i")
            delay(100)
        }
        channel.close()
    }

    // Consumer coroutine
    val consumer = launch {
        for (value in channel) {
            println("Received: $value")
            delay(150)
        }
    }

    producer.join()
    consumer.join()
}

// 7. Actor Pattern
sealed class CounterMessage {
    object Increment : CounterMessage()
    object Decrement : CounterMessage()
    class GetValue(val response: CompletableDeferred<Int>) : CounterMessage()
}

fun actorExample() = runBlocking {
    val counterActor = actor<CounterMessage>(Dispatchers.Default) {
        var counter = 0
        for (message in channel) {
            when (message) {
                is CounterMessage.Increment -> counter++
                is CounterMessage.Decrement -> counter--
                is CounterMessage.GetValue -> message.response.complete(counter)
            }
        }
    }

    // Send messages to actor
    repeat(5) {
        counterActor.send(CounterMessage.Increment)
    }

    // Get value from actor
    val response = CompletableDeferred<Int>()
    counterActor.send(CounterMessage.GetValue(response))
    val value = response.await()

    println("Counter value: $value")
    counterActor.close()
}

// 8. Flow for Reactive Streams
fun flowExample() = runBlocking {
    val flow = flow {
        for (i in 1..10) {
            delay(100)
            emit(i)
        }
    }

    flow
        .filter { it % 2 == 0 }
        .map { it * it }
        .collect { value ->
            println("Collected: $value")
        }
}

// 9. StateFlow and SharedFlow
class NewsRepository {
    private val _news = MutableStateFlow("No news yet")
    val news: StateFlow<String> = _news

    private val _updates = MutableSharedFlow<String>()
    val updates: SharedFlow<String> = _updates

    suspend fun fetchLatestNews() {
        delay(1000)
        _news.value = "Breaking: Kotlin coroutines are awesome!"
        _updates.emit("News updated at ${System.currentTimeMillis()}")
    }
}

fun stateFlowExample() = runBlocking {
    val repository = NewsRepository()

    // Collect news updates
    val newsJob = launch {
        repository.news.collect { news ->
            println("News update: $news")
        }
    }

    // Collect specific updates
    val updatesJob = launch {
        repository.updates.collect { update ->
            println("Update: $update")
        }
    }

    // Simulate multiple news updates
    repeat(3) {
        delay(1500)
        repository.fetchLatestNews()
    }

    delay(500)
    newsJob.cancel()
    updatesJob.cancel()
}

// 10. Coroutine Exception Handling
fun exceptionHandlingExample() = runBlocking {
    val handler = CoroutineExceptionHandler { _, exception ->
        println("Caught ${exception::class.simpleName}: ${exception.message}")
    }

    val job = launch(handler) {
        println("About to throw exception")
        throw RuntimeException("Something went wrong!")
    }

    job.join()

    // Exception handling with try-catch
    try {
        val result = async {
            delay(500)
            throw IllegalArgumentException("Invalid argument")
        }.await()
    } catch (e: Exception) {
        println("Caught exception: ${e.message}")
    }
}

// 11. Parallel Processing with Coroutines
suspend fun processDataInParallel(data: List<Int>): List<Int> = coroutineScope {
    val chunkSize = 100
    val chunks = data.chunked(chunkSize)

    chunks.map { chunk ->
        async(Dispatchers.Default) {
            chunk.map { it * 2 }
        }
    }.awaitAll().flatten()
}

fun parallelProcessingExample() = runBlocking {
    val data = (1..1000).toList()

    val time = measureTimeMillis {
        val result = processDataInParallel(data)
        println("Processed ${result.size} items")
    }

    println("Parallel processing took: $time ms")
}

// 12. Debounce and Throttle Operators
fun debounceThrottleExample() = runBlocking {
    val events = MutableSharedFlow<Int>()

    // Debounce operator
    val debouncedFlow = events
        .debounce(300)
        .onEach { println("Debounced: $it") }
        .launchIn(this)

    // Throttle operator
    val throttledFlow = events
        .sample(200)
        .onEach { println("Throttled: $it") }
        .launchIn(this)

    // Emit events rapidly
    repeat(10) { i ->
        delay(100)
        events.emit(i)
    }

    delay(1000)
}

// 13. Retry Mechanism
suspend fun <T> retry(
    times: Int = 3,
    initialDelayMillis: Long = 100,
    factor: Double = 2.0,
    block: suspend () -> T
): T {
    var currentDelay = initialDelayMillis
    repeat(times - 1) {
        try {
            return block()
        } catch (e: Exception) {
            println("Attempt failed: ${e.message}. Retrying in ${currentDelay}ms")
            delay(currentDelay)
            currentDelay = (currentDelay * factor).toLong()
        }
    }
    return block() // Last attempt
}

fun retryExample() = runBlocking {
    var attempts = 0
    val result = retry(times = 3) {
        attempts++
        if (attempts < 3) {
            throw RuntimeException("Simulated failure")
        }
        "Success after $attempts attempts"
    }

    println(result)
}

// 14. Coroutine Timeout
fun timeoutExample() = runBlocking {
    try {
        withTimeout(1000) {
            delay(2000) // This will timeout
            "This won't be reached"
        }
    } catch (e: TimeoutCancellationException) {
        println("Operation timed out: ${e.message}")
    }

    try {
        val result = withTimeoutOrNull(1500) {
            delay(1000) // This will succeed
            "Operation completed successfully"
        }
        println("Result: \$result")
    } catch (e: Exception) {
        println("Unexpected error: ${e.message}")
    }
}

// 15. Coroutine Worker Pool
class WorkerPool(private val poolSize: Int) {
    private val job = SupervisorJob()
    private val dispatcher = Dispatchers.Default.limitedParallelism(poolSize)
    private val channel = Channel<suspend () -> Unit>(Channel.UNLIMITED)

    init {
        repeat(poolSize) {
            launch(dispatcher) {
                for (task in channel) {
                    try {
                        task()
                    } catch (e: Exception) {
                        println("Worker error: ${e.message}")
                    }
                }
            }
        }
    }

    suspend fun execute(task: suspend () -> Unit) {
        channel.send(task)
    }

    fun shutdown() {
        job.cancel()
        channel.close()
    }
}

fun workerPoolExample() = runBlocking {
    val pool = WorkerPool(3)

    repeat(10) { i ->
        pool.execute {
            delay(Random.nextLong(100, 500))
            println("Task $i completed by ${Thread.currentThread().name}")
        }
    }

    delay(3000)
    pool.shutdown()
}

// Main function demonstrating all coroutine examples
fun main() {
    println("=== Kotlin Coroutines Examples ===
")

    // Basic examples
    println("1. Basic Coroutine:")
    basicCoroutineExample()

    println("
2. Async/Await:")
    asyncAwaitExample()

    println("
3. Dispatchers:")
    dispatchersExample()

    println("
4. Structured Concurrency:")
    structuredConcurrencyExample()

    println("
5. Channel Communication:")
    channelExample()

    println("
6. Actor Pattern:")
    actorExample()

    println("
7. Flow Reactive Streams:")
    flowExample()

    println("
8. StateFlow and SharedFlow:")
    stateFlowExample()

    println("
9. Exception Handling:")
    exceptionHandlingExample()

    println("
10. Parallel Processing:")
    parallelProcessingExample()

    println("
11. Debounce and Throttle:")
    debounceThrottleExample()

    println("
12. Retry Mechanism:")
    retryExample()

    println("
13. Timeout:")
    timeoutExample()

    println("
14. Worker Pool:")
    workerPoolExample()

    println("
=== Coroutines Examples Completed ===")
}