// 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.

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})';
  }
}
