abstract class Interpolator {
  double get(double x);
}

class EarlyInterpolator implements Interpolator {
  double amount;

  EarlyInterpolator(this.amount);

  @override
  double get(double x) {
    if (x >= amount) {
      return 1;
    } else {
      return MathUtils.map(x, 0, amount, 0, 1);
    }
  }
}

class Point2D {
  double x, y;

  Point2D(this.x, this.y);
}

class MathUtils {
  static double map(double x, double a, double b, double u, double v) {
    double p = (x - a) / (b - a);
    return u + p * (v - u);
  }

  static double clampedMap(double x, double a, double b, double u, double v) {
    if (x <= a) {
      return u;
    } else if (x >= b) {
      return v;
    } else {
      double p = (x - a) / (b - a);
      return u + p * (v - u);
    }
  }

  static double clamp(double x, double a, double b) {
    if (x < a) return a;
    if (x > b) return b;
    return x;
  }
}