// CHECK:
//   Mangled name: Monoid
//   Public signature: /Monoid|null[0]
interface Monoid<T : Any?> : Semigroup<T> {
  // CHECK JVM_IR:
  //   Mangled name: Monoid#combine@1:0(1:0){}1:0
  //   Public signature: /Monoid.combine|-3517256775590682507[0]
  //   Public signature debug description: combine@1:0(1:0){}1:0
  // CHECK JS_IR NATIVE:
  //   Mangled name: Monoid#combine@1:0(1:0){}
  //   Public signature: /Monoid.combine|8412967464389689937[0]
  //   Public signature debug description: combine@1:0(1:0){}
  abstract /* fake */ override infix fun T.combine(other: T): T

  // CHECK:
  //   Mangled name: Monoid{}unit
  //   Public signature: /Monoid.unit|-5200734743185576787[0]
  //   Public signature debug description: {}unit
  abstract val unit: T
    // CHECK JVM_IR:
    //   Mangled name: Monoid#<get-unit>(){}1:0
    //   Public signature: /Monoid.unit.<get-unit>|-2842189358620964971[0]
    //   Public signature debug description: <get-unit>(){}1:0
    // CHECK JS_IR NATIVE:
    //   Mangled name: Monoid#<get-unit>(){}
    //   Public signature: /Monoid.unit.<get-unit>|1530864625432111105[0]
    //   Public signature debug description: <get-unit>(){}
    abstract get

}

// CHECK:
//   Mangled name: Semigroup
//   Public signature: /Semigroup|null[0]
interface Semigroup<T : Any?> {
  // CHECK JVM_IR:
  //   Mangled name: Semigroup#combine@1:0(1:0){}1:0
  //   Public signature: /Semigroup.combine|-3517256775590682507[0]
  //   Public signature debug description: combine@1:0(1:0){}1:0
  // CHECK JS_IR NATIVE:
  //   Mangled name: Semigroup#combine@1:0(1:0){}
  //   Public signature: /Semigroup.combine|8412967464389689937[0]
  //   Public signature debug description: combine@1:0(1:0){}
  abstract infix fun T.combine(other: T): T

}

// CHECK:
//   Mangled name: IntMonoid
//   Public signature: /IntMonoid|null[0]
object IntMonoid : Monoid<Int> {
  // CHECK:
  //   Mangled name: IntMonoid{}unit
  //   Public signature: /IntMonoid.unit|-5200734743185576787[0]
  //   Public signature debug description: {}unit
  override val unit: Int
    // CHECK JVM_IR:
    //   Mangled name: IntMonoid#<get-unit>(){}kotlin.Int
    //   Public signature: /IntMonoid.unit.<get-unit>|3772729924213749256[0]
    //   Public signature debug description: <get-unit>(){}kotlin.Int
    // CHECK JS_IR NATIVE:
    //   Mangled name: IntMonoid#<get-unit>(){}
    //   Public signature: /IntMonoid.unit.<get-unit>|1530864625432111105[0]
    //   Public signature debug description: <get-unit>(){}
    override get

  // CHECK:
  //   Mangled name: IntMonoid#<init>(){}
  //   Public signature: /IntMonoid.<init>|-5645683436151566731[0]
  //   Public signature debug description: <init>(){}
  private constructor() /* primary */

  // CHECK JVM_IR:
  //   Mangled name: IntMonoid#combine@kotlin.Int(kotlin.Int){}kotlin.Int
  //   Public signature: /IntMonoid.combine|4765448259581317405[0]
  //   Public signature debug description: combine@kotlin.Int(kotlin.Int){}kotlin.Int
  // CHECK JS_IR NATIVE:
  //   Mangled name: IntMonoid#combine@kotlin.Int(kotlin.Int){}
  //   Public signature: /IntMonoid.combine|4429091503069708823[0]
  //   Public signature debug description: combine@kotlin.Int(kotlin.Int){}
  override infix fun Int.combine(other: Int): Int

}

// CHECK:
//   Mangled name: StringMonoid
//   Public signature: /StringMonoid|null[0]
object StringMonoid : Monoid<String> {
  // CHECK:
  //   Mangled name: StringMonoid{}unit
  //   Public signature: /StringMonoid.unit|-5200734743185576787[0]
  //   Public signature debug description: {}unit
  override val unit: String
    // CHECK JVM_IR:
    //   Mangled name: StringMonoid#<get-unit>(){}kotlin.String
    //   Public signature: /StringMonoid.unit.<get-unit>|4504480110251605077[0]
    //   Public signature debug description: <get-unit>(){}kotlin.String
    // CHECK JS_IR NATIVE:
    //   Mangled name: StringMonoid#<get-unit>(){}
    //   Public signature: /StringMonoid.unit.<get-unit>|1530864625432111105[0]
    //   Public signature debug description: <get-unit>(){}
    override get

  // CHECK:
  //   Mangled name: StringMonoid#<init>(){}
  //   Public signature: /StringMonoid.<init>|-5645683436151566731[0]
  //   Public signature debug description: <init>(){}
  private constructor() /* primary */

  // CHECK JVM_IR:
  //   Mangled name: StringMonoid#combine@kotlin.String(kotlin.String){}kotlin.String
  //   Public signature: /StringMonoid.combine|-5815259829474546918[0]
  //   Public signature debug description: combine@kotlin.String(kotlin.String){}kotlin.String
  // CHECK JS_IR NATIVE:
  //   Mangled name: StringMonoid#combine@kotlin.String(kotlin.String){}
  //   Public signature: /StringMonoid.combine|-2748332935123183663[0]
  //   Public signature debug description: combine@kotlin.String(kotlin.String){}
  override infix fun String.combine(other: String): String

}

// CHECK JVM_IR:
//   Mangled name: #box(){}kotlin.String
//   Public signature: /box|-9347091776561469[0]
//   Public signature debug description: box(){}kotlin.String
// CHECK JS_IR NATIVE:
//   Mangled name: #box(){}
//   Public signature: /box|2173511048851971368[0]
//   Public signature debug description: box(){}
fun box(): String

// CHECK JVM_IR:
//   Mangled name: #sum!Monoid<0:0>@kotlin.collections.List<0:0>(){0§<kotlin.Any?>}0:0
//   Public signature: /sum|7635142307973834922[0]
//   Public signature debug description: sum!Monoid<0:0>@kotlin.collections.List<0:0>(){0§<kotlin.Any?>}0:0
// CHECK JS_IR NATIVE:
//   Mangled name: #sum!Monoid<0:0>@kotlin.collections.List<0:0>(){0§<kotlin.Any?>}
//   Public signature: /sum|6490726678726957775[0]
//   Public signature debug description: sum!Monoid<0:0>@kotlin.collections.List<0:0>(){0§<kotlin.Any?>}
fun <T : Any?> List<T>.sum($context_receiver_0: Monoid<T>): T

