// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library isolate.example.runner_pool;

import "dart:async" show Future;

import "package:isolate/load_balancer.dart";
import "package:isolate/isolate_runner.dart";

void main() {
  int N = 44;
  var sw = new Stopwatch()..start();
  // Compute fib up to 42 with 4 isolates.
  parfib(N, 4).then((v1) {
    var t1 = sw.elapsedMilliseconds;
    sw.stop();
    sw.reset();
    print("fib#4(${N}) = ${v1[N]}, ms: $t1");
    sw.start();
    // Then compute fib up to 42 with 2 isolates.
    parfib(N, 2).then((v2) {
      var t2 = sw.elapsedMilliseconds;
      sw.stop();
      print("fib#2(${N}) = ${v2[N]}, ms: $t2");
    });
  });
}

// Compute fibonacci 1..limit
Future<List<int>> parfib(int limit, int parallelity) {
  return LoadBalancer
      .create(parallelity, IsolateRunner.spawn)
      .then((LoadBalancer pool) {
    var fibs = new List<Future<int>>(limit + 1);
    // Schedule all calls with exact load value and the heaviest task
    // assigned first.
    schedule(a, b, i) {
      if (i < limit) {
        schedule(a + b, a, i + 1);
      }
      fibs[i] = pool.run<int, int>(fib, i, load: a);
    }

    schedule(0, 1, 0);
    // And wait for them all to complete.
    return Future.wait(fibs).whenComplete(pool.close);
  });
}

int computeFib(int n) {
  var result = fib(n);
  return result;
}

int fib(int n) {
  if (n < 2) return n;
  return fib(n - 1) + fib(n - 2);
}
