// Copyright (c) 2016, 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.

// @dart = 2.9

/// @assertion SplayTreeMap([int compare(K key1, K key2),
/// bool isValidKey(potentialKey)])
/// Keys of the map are compared using the [compare] function passed in the
/// constructor, both for ordering and for equality.
/// @description Checks that [compare] function works as expected.
/// @author sgrekhov@unipro.ru

import "dart:collection";
import "../../../Utils/expect.dart";

class C {
  int value;
  C(this.value);
}

int compare(var key1, var key2) {
  return key1.value - key2.value;
}

main() {
  SplayTreeMap map = new SplayTreeMap(compare);
  C c1 = new C(2);
  C c2 = new C(1);
  C c3 = new C(-1);
  C c4 = new C(1);

  map[c1] = 1;
  map[c2] = 2;
  map[c3] = 3;
  map[c4] = 4;

  Expect.equals(c3, map.firstKey());
  Expect.equals(c1, map.lastKey());
  Expect.equals(4, map[c2]);
  Expect.equals(4, map[c4]);
}
