// 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() {
  var N = 44;
  var sw = 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 = List<Future<int>>(limit + 1);
    // Schedule all calls with exact load value and the heaviest task
    // assigned first.
    void 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);
}
