functional list, queues and package for concurrent

This commit is contained in:
Alex Tkachman
2012-02-01 14:55:36 +02:00
parent 699c43fe58
commit ac729504bf
5 changed files with 87 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
package std.concurrent
abstract class FunctionalList<T>(val size: Int) {
abstract val head: T
abstract val tail: FunctionalList<T>
val empty : Boolean
get() = size == 0
fun add(element: T) : FunctionalList<T> = FunctionalList.Standard(element, this)
fun reversed() : FunctionalList<T> {
if(empty)
return this
var cur = tail
var new = of(head)
while(!cur.empty) {
new = new.add(cur.head)
cur = cur.tail
}
return new
}
fun iterator() = object: Iterator<T> {
var cur = this@FunctionalList
override fun next(): T {
if(cur.empty)
throw java.util.NoSuchElementException()
val head = cur.head
cur = cur.tail
return head
}
override val hasNext: Boolean
get() = !cur.empty
}
class object {
class Empty<T>() : FunctionalList<T>(0) {
override val head: T
get() = throw java.util.NoSuchElementException()
override val tail: FunctionalList<T>
get() = throw java.util.NoSuchElementException()
}
class Standard<T>(override val head: T, override val tail: FunctionalList<T>) : FunctionalList<T>(tail.size+1)
fun <T> emptyList() = Empty<T>()
fun <T> of(element: T) : FunctionalList<T> = FunctionalList.Standard<T>(element,emptyList())
}
}
@@ -0,0 +1,30 @@
package std.concurrent
import java.util.concurrent.Executor
import jet.Iterator
class FunctionalQueue<T>(
val input: FunctionalList<T> = FunctionalList.emptyList<T>(),
val output: FunctionalList<T> = FunctionalList.emptyList<T>()) {
val size : Int
get() = input.size + output.size
val empty : Boolean
get() = size == 0
fun add(element: T) = FunctionalQueue<T>(input add element, output)
fun addFirst(element: T) = FunctionalQueue<T>(input, output add element)
fun removeFirst() : #(T,FunctionalQueue<T>) =
if(output.empty) {
if(input.empty)
throw java.util.NoSuchElementException()
else
FunctionalQueue<T>(FunctionalList.emptyList<T>(), input.reversed()).removeFirst()
}
else {
#(output.head, FunctionalQueue<T>(input, output.tail))
}
}