namespace std.util import java.util.* /** Returns the size of the collection */ val Collection<*>.size : Int get() = size() /** Returns true if this collection is empty */ val Collection<*>.empty : Boolean get() = isEmpty() /** Returns a new ArrayList with a variable number of initial elements */ inline fun arrayList(vararg values: T) : ArrayList { val answer = ArrayList() for (v in values) answer.add(v) return answer; } /** Returns a new HashSet with a variable number of initial elements */ inline fun hashSet(vararg values: T) : HashSet { val answer = HashSet() for (v in values) answer.add(v) return answer; } /** Returns a new collection for the results of a helper method */ protected fun java.lang.Iterable.create(defaultSize: Int? = null) : Collection { if (defaultSize != null) { return ArrayList(defaultSize) } else { return ArrayList() } } protected fun Set.create(defaultSize: Int? = null) : Set { if (defaultSize != null) { return HashSet(defaultSize) } else { return HashSet() } } /** Returns true if any elements in the collection match the given predicate */ inline fun java.lang.Iterable.any(predicate: fun(T): Boolean) : Boolean { for (elem in this) { if (predicate(elem)) { return true } } return false } /** Returns true if all elements in the collection match the given predicate */ inline fun java.lang.Iterable.all(predicate: fun(T): Boolean) : Boolean { for (elem in this) { if (!predicate(elem)) { return false } } return true } /** Returns the first item in the collection which matches the given predicate or null if none matched */ inline fun java.lang.Iterable.find(predicate: fun(T): Boolean) : T? { for (elem in this) { if (predicate(elem)) return elem } return null } /** Returns a new collection containing all elements in this collection which match the given predicate */ // TODO using: Collection for the return type - I wonder if this exact type could be // deduced somewhat from the This.Type; e.g. returning Set on a Set, Array on Array etc inline fun java.lang.Iterable.filter(predicate: fun(T): Boolean) : Collection { val result = this.create() for (elem in this) { if (predicate(elem)) result.add(elem) } return result } /** * Returns the result of transforming each item in the collection to a one or more values which * are concatenated together into a single collection */ // TODO should use Iterable instead of Collection in transform? inline fun java.lang.Iterable.flatMap(transform: fun(T): Collection) : Collection { val result = this.create() for (elem in this) { val coll = transform(elem) if (coll != null) { for (r in coll) { result.add(r) } } } return result } /** Performs the given operation on each element inside the collection */ inline fun java.lang.Iterable.foreach(operation: fun(element: T) : Unit) { for (elem in this) operation(elem) } /** Creates a String from all the elements in the collection, using the seperator between them and using the given prefix and postfix if supplied */ inline fun java.lang.Iterable.join(separator: String, prefix: String = "", postfix: String = "") : String { val buffer = StringBuilder(prefix) var first = true for (elem in this) { if (first) first = false else buffer.append(separator) buffer.append(elem) } buffer.append(postfix) return buffer.toString().sure() } /** Returns a new collection containing the results of applying the given function to each element in this collection */ inline fun java.lang.Iterable.map(transform : fun(T) : R) : Collection { val result = this.create() for (item in this) result.add(transform(item)) return result } /** Returns a new collection containing the results of applying the given function to each element in this collection */ inline fun java.util.Collection.map(transform : fun(T) : R) : Collection { val result = this.create(this.size) for (item in this) result.add(transform(item)) return result } inline fun > java.lang.Iterable.toSortedList() : List { val answer = this.toList() answer.sort() return answer } inline fun > java.lang.Iterable.toSortedList(comparator: java.util.Comparator) : List { val answer = this.toList() answer.sort(comparator) return answer } /** TODO figure out necessary variance/generics ninja stuff... :) inline fun java.lang.Iterable.toSortedList(transform: fun(T) : java.lang.Comparable<*>) : List { val answer = this.toList() answer.sort(transform) return answer } */ inline fun java.lang.Iterable.toList() : List { if (this is List) return this else { val list = ArrayList() for (elem in this) list.add(elem) return list } } inline fun java.util.Collection.toArray() : Array { if (this is Array) return this else { val answer = Array(this.size) var idx = 0 for (elem in this) answer[idx++] = elem return answer as Array } } // List APIs inline fun > List.sort() : Unit { Collections.sort(this) } inline fun > List.sort(comparator: java.util.Comparator) : Unit { Collections.sort(this, comparator) } /** TODO figure out necessary variance/generics ninja stuff... :) inline fun List.sort(transform: fun(T) : java.lang.Comparable<*>) : List { val comparator = java.util.Comparator() { fun compare(o1: T, o2: T): Int { val v1 = transform(o1) val v2 = transform(o2) if (v1 == v2) { return 0 } else { return v1.compareTo(v2) } } } answer.sort(comparator) } */ val List.head : T? get() = this.get(0) val List.first : T? get() = this.head val List.tail : T? get() { val s = this.size return if (s > 0) this.get(s - 1) else null } val List.last : T? get() = this.tail