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