//
// Source
// ------------------------------------------

import androidx.compose.runtime.*

@Composable fun Test(inputs: List<Int>) {
    val objs = inputs.map {
        object {
            init {
                Foo()
            }

            val state = Foo()
            val value by Foo()
        }
    }
    objs.forEach {
        println(it.state)
        println(it.value)
    }
}

//
// Transformed IR
// ------------------------------------------

@Composable
fun Test(inputs: List<Int>, %composer: Composer?, %changed: Int) {
  %composer = %composer.startRestartGroup(<>)
  sourceInformation(%composer, "C(Test):Test.kt")
  val %dirty = %changed
  if (%changed and 0b0110 == 0) {
    %dirty = %dirty or if (%composer.changedInstance(inputs)) 0b0100 else 0b0010
  }
  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
    if (isTraceInProgress()) {
      traceEventStart(<>, %dirty, -1, <>)
    }
    val objs = inputs.map { it: Int ->
      val tmp0_return = <block>{
        object {
          init {
            Foo(%composer, 0)
          }
          val state: State<Int> = Foo(%composer, 0)
          val value: State<Int> = Foo(%composer, 0)
            get() {
              return <this>.value%delegate.getValue(<this>, ::value)
            }
        }
      }
      tmp0_return
    }
    objs.forEach { it: <no name provided> ->
      println(it.state)
      println(it.value)
    }
    if (isTraceInProgress()) {
      traceEventEnd()
    }
  } else {
    %composer.skipToGroupEnd()
  }
  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
    Test(inputs, %composer, updateChangedFlags(%changed or 0b0001))
  }
}
