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

part of touch;

/**
 * Represents a point in 2 dimensional space.
 */
class Coordinate {
  /**
   * X-value
   */
  num x;

  /**
   * Y-value
   */
  num y;

  Coordinate([num this.x = 0, num this.y = 0]) {}

  /**
   * Gets the coordinates of a touch's location relative to the window's
   * viewport. [input] is either a touch object or an event object.
   */
  Coordinate.fromClient(var input) : this(input.client.x, input.client.y);

  static Coordinate difference(Coordinate a, Coordinate b) {
    return new Coordinate(a.x - b.x, a.y - b.y);
  }

  static num distance(Coordinate a, Coordinate b) {
    final dx = a.x - b.x;
    final dy = a.y - b.y;
    return Math.sqrt(dx * dx + dy * dy);
  }

  bool operator ==(covariant Coordinate other) {
    return other != null && x == other.x && y == other.y;
  }

  int get hashCode => throw new UnimplementedError();

  static num squaredDistance(Coordinate a, Coordinate b) {
    final dx = a.x - b.x;
    final dy = a.y - b.y;
    return dx * dx + dy * dy;
  }

  static Coordinate sum(Coordinate a, Coordinate b) {
    return new Coordinate(a.x + b.x, a.y + b.y);
  }

  /**
   * Returns a new copy of the coordinate.
   */
  Coordinate clone() => new Coordinate(x, y);

  String toString() => "($x, $y)";
}

/**
 * Represents the interval { x | start <= x < end }.
 */
class Interval {
  final num start;
  final num end;

  Interval(num this.start, num this.end) {}

  num get length {
    return end - start;
  }

  bool operator ==(covariant Interval other) {
    return other != null && other.start == start && other.end == end;
  }

  int get hashCode => throw new UnimplementedError();

  Interval union(Interval other) {
    return new Interval(Math.min(start, other.start), Math.max(end, other.end));
  }

  bool contains(num value) {
    return value >= start && value < end;
  }

  String toString() {
    return '(${start}, ${end})';
  }
}
