Make the run method generic
diff --git a/example/runner_pool.dart b/example/runner_pool.dart
index cb08da2..efb81e5 100644
--- a/example/runner_pool.dart
+++ b/example/runner_pool.dart
@@ -40,7 +40,7 @@
       if (i < limit) {
         schedule(a + b, a, i + 1);
       }
-      fibs[i] = pool.run(fib, i, load: a);
+      fibs[i] = pool.run<int, int>(fib, i, load: a);
     }
 
     schedule(0, 1, 0);
diff --git a/lib/isolate_runner.dart b/lib/isolate_runner.dart
index da518f3..55bb759 100644
--- a/lib/isolate_runner.dart
+++ b/lib/isolate_runner.dart
@@ -184,7 +184,8 @@
   ///     } finally {
   ///       await iso.close();
   ///     }
-  Future run(function(argument), argument, {Duration timeout, onTimeout()}) {
+  Future<R> run<R, P>(R function(P argument), P argument,
+      {Duration timeout, onTimeout()}) {
     return singleResultFuture((SendPort port) {
       _commandPort.send(list4(_RUN, function, argument, port));
     }, timeout: timeout, onTimeout: onTimeout);
diff --git a/lib/load_balancer.dart b/lib/load_balancer.dart
index cd7c193..631d89b 100644
--- a/lib/load_balancer.dart
+++ b/lib/load_balancer.dart
@@ -69,7 +69,7 @@
   /// If [timeout] and [onTimeout] are provided, they are forwarded to
   /// the runner running the function, which will handle a timeout
   /// as normal.
-  Future run(function(argument), argument,
+  Future<R> run<R, P>(R function(P argument), argument,
       {Duration timeout, onTimeout(), int load: 100}) {
     RangeError.checkNotNegative(load, "load");
     _LoadBalancerEntry entry = _first;
@@ -265,10 +265,10 @@
   /// Whether the entry is still in the queue.
   bool get inQueue => queueIndex >= 0;
 
-  Future run(LoadBalancer balancer, int load, function(argument), argument,
-      Duration timeout, onTimeout()) {
+  Future<R> run<R, P>(LoadBalancer balancer, int load, R function(P argument),
+      argument, Duration timeout, onTimeout()) {
     return runner
-        .run(function, argument, timeout: timeout, onTimeout: onTimeout)
+        .run<R, P>(function, argument, timeout: timeout, onTimeout: onTimeout)
         .whenComplete(() {
       balancer._decreaseLoad(this, load);
     });
diff --git a/lib/runner.dart b/lib/runner.dart
index 018dcd8..a8a848c 100644
--- a/lib/runner.dart
+++ b/lib/runner.dart
@@ -35,7 +35,7 @@
   /// complete with a [TimeoutException].
   ///
   /// The default implementation runs the function in the current isolate.
-  Future run(function(argument), Object argument,
+  Future<R> run<R, P>(R function(P argument), P argument,
       {Duration timeout, onTimeout()}) {
     Future result = new Future.sync(() => function(argument));
     if (timeout != null) {