virtual class Builder { [operator] fun plusAssign(item : E) fun result() : R } virtual class Buildable { fun newBuilder() : Builder } class List { class object : Buildable { override fun newBuilder() : Builder } } extension Map where T : Iterable, class object T : Buildable for T { fun map(f : {(E) : R}) : T = { val builder = T.newBuilder() for (e in this) { builder += f(e) } builder.result() } }