package moe.kageru.spektacles open class Counter(source: Iterable) : Iterable> { val counts: Map = mutableMapOf().apply { for (element in source) { this[element] = this.getOrDefault(element, 0) + 1 } } override fun iterator(): Iterator> { return counts.entries.iterator() } override fun toString(): String { return counts.entries.joinToString("\n") { "${it.key}: ${it.value}" } } } class SortedCounter>(source: Iterable): Counter(source) { override fun toString(): String { return counts.entries.sortedBy { it.key }.joinToString("\n") { "${it.key}: ${it.value}" } } } fun Iterable.toCounter(): Counter = Counter(this) fun > Iterable.toSortedCounter(): SortedCounter = SortedCounter(this)