From ac434d48525a0e5b57c66b9f61b388ccf3d898b5 Mon Sep 17 00:00:00 2001 From: Hiram Chirino Date: Wed, 18 Jul 2012 14:55:50 -0400 Subject: [PATCH] Adding support for transforming functions into Callable objects and integration with ExecutorService. --- libraries/stdlib/src/kotlin/Standard.kt | 11 +++++++++++ .../stdlib/src/kotlin/concurrent/Thread.kt | 18 ++++++++++++++++++ libraries/stdlib/test/concurrent/ThreadTest.kt | 10 ++++++++++ 3 files changed, 39 insertions(+) diff --git a/libraries/stdlib/src/kotlin/Standard.kt b/libraries/stdlib/src/kotlin/Standard.kt index 3d100aa6b5d..9d5e3328847 100644 --- a/libraries/stdlib/src/kotlin/Standard.kt +++ b/libraries/stdlib/src/kotlin/Standard.kt @@ -4,6 +4,7 @@ import java.util.ArrayList import java.util.Collection import java.util.HashSet import java.util.LinkedList +import java.util.concurrent.Callable /** Helper to make jet.Iterator usable in for @@ -77,3 +78,13 @@ public inline fun runnable(action: ()-> Unit): Runnable { } } } + +/** + * A helper method for creating a [[Callable]] from a function + */ +public inline fun callable(action: ()-> T): Callable { + return object: Callable { + public override fun call() = action() + } +} + diff --git a/libraries/stdlib/src/kotlin/concurrent/Thread.kt b/libraries/stdlib/src/kotlin/concurrent/Thread.kt index f0d6e8ce956..0c12a2dfc1a 100644 --- a/libraries/stdlib/src/kotlin/concurrent/Thread.kt +++ b/libraries/stdlib/src/kotlin/concurrent/Thread.kt @@ -1,6 +1,9 @@ package kotlin.concurrent import java.util.concurrent.Executor +import java.util.concurrent.ExecutorService +import java.util.concurrent.Future +import java.util.concurrent.Callable inline val currentThread : Thread get() = Thread.currentThread().sure() @@ -58,3 +61,18 @@ public inline fun Executor.invoke(action: ()->Unit) { execute(runnable(action)) } +/** + * Executes the given block on the [[Executor]] + */ +public inline fun ExecutorService.submit(action: ()->T):Future { + val c:Callable = callable(action) + return submit(c).sure(); +} + +/** +* Allows you to use the executor as a function to +* execute the given block on the [[Executor]]. +*/ +public inline fun ExecutorService.invoke(action: ()->T):Future { + return submit(action) +} \ No newline at end of file diff --git a/libraries/stdlib/test/concurrent/ThreadTest.kt b/libraries/stdlib/test/concurrent/ThreadTest.kt index af40e7f7200..54bab4576ae 100644 --- a/libraries/stdlib/test/concurrent/ThreadTest.kt +++ b/libraries/stdlib/test/concurrent/ThreadTest.kt @@ -18,4 +18,14 @@ class ThreadTest { } assertTrue(countDown.await(2, SECONDS), "Count down is executed") } + + test fun callableInvoke() { + + val pool = Executors.newFixedThreadPool(1).sure() + val future = pool { + "Hello" + } + assertEquals("Hello", future.get(2, SECONDS)) + } + } \ No newline at end of file