abstract class BinaryConstraint extends Constraint {
  BinaryConstraint(this.v1, this.v2, Strength strength) : super(strength) {}
  Variable input() => direction == FORWARD ? v1 : v2;
  Variable output() => direction == FORWARD ? v2 : v1;
  Variable v1;
  Variable v2;
  bool inputsKnown(int mark) {}
  bool isSatisfied() => direction != NONE;
  int direction = NONE;
  void addToGraph() {}
  void chooseMethod(int mark) {}
  void markInputs(int mark) {}
  void markUnsatisfied() {}
  void recalculate() {}
  void removeFromGraph() {}
}

abstract class Constraint {
  Constraint? satisfy(mark) {}
  Variable output();
  bool inputsKnown(int mark);
  bool isInput() => false;
  bool isSatisfied();
  const Constraint(this.strength);
  final Strength strength;
  void addConstraint() {}
  void addToGraph();
  void chooseMethod(int mark);
  void destroyConstraint() {}
  void execute();
  void markInputs(int mark);
  void markUnsatisfied();
  void recalculate();
  void removeFromGraph();
}

abstract class UnaryConstraint extends Constraint {
  UnaryConstraint(this.myOutput, Strength strength) : super(strength) {}
  Variable output() => myOutput;
  bool inputsKnown(int mark) => true;
  bool isSatisfied() => satisfied;
  bool satisfied = false;
  final Variable myOutput;
  void addToGraph() {}
  void chooseMethod(int mark) {}
  void markInputs(int mark) {}
  void markUnsatisfied() {}
  void recalculate() {}
  void removeFromGraph() {}
}

class DeltaBlue {
  void run() {}
}

class EditConstraint extends UnaryConstraint {
  EditConstraint(Variable v, Strength str) : super(v, str);
  bool isInput() => true;
  void execute() {}
}

class EqualityConstraint extends BinaryConstraint {
  EqualityConstraint(Variable v1, Variable v2, Strength strength)
      : super(v1, v2, strength);
  void execute() {}
}

class Plan {
  List<Constraint> list = <Constraint>[];
  int size() => list.length;
  void addConstraint(Constraint c) {}
  void execute() {}
}

class Planner {
  List<Constraint> removePropagateFrom(Variable out) {}
  Plan extractPlanFromConstraints(List<Constraint> constraints) {}
  Plan makePlan(List<Constraint> sources) {}
  bool addPropagate(Constraint c, int mark) {}
  int currentMark = 0;
  int newMark() => ++currentMark;
  void addConstraintsConsumingTo(Variable v, List<Constraint> coll) {}
  void incrementalAdd(Constraint c) {}
  void incrementalRemove(Constraint c) {}
}

class ScaleConstraint extends BinaryConstraint {
  ScaleConstraint(
      Variable src, this.scale, this.offset, Variable dest, Strength strength)
      : super(src, dest, strength);
  final Variable offset;
  final Variable scale;
  void addToGraph() {}
  void execute() {}
  void markInputs(int mark) {}
  void recalculate() {}
  void removeFromGraph() {}
}

class StayConstraint extends UnaryConstraint {
  StayConstraint(Variable v, Strength str) : super(v, str);
  void execute() {}
}

class Strength {
  Strength nextWeaker() => const <Strength>[
        STRONG_PREFERRED,
        PREFERRED,
        STRONG_DEFAULT,
        NORMAL,
        WEAK_DEFAULT,
        WEAKEST
      ][value];
  const Strength(this.value, this.name);
  final String name;
  final int value;
  static Strength strongest(Strength s1, Strength s2) {}
  static Strength weakest(Strength s1, Strength s2) {}
  static bool stronger(Strength s1, Strength s2) {}
  static bool weaker(Strength s1, Strength s2) {}
}

class Variable {
  Constraint? determinedBy;
  List<Constraint> constraints = <Constraint>[];
  Strength walkStrength = WEAKEST;
  Variable(this.name, this.value);
  bool stay = true;
  final String name;
  int mark = 0;
  int value;
  void addConstraint(Constraint c) {}
  void removeConstraint(Constraint c) {}
}

const NORMAL = const Strength(4, "normal");
const PREFERRED = const Strength(2, "preferred");
const REQUIRED = const Strength(0, "required");
const STRONG_DEFAULT = const Strength(3, "strongDefault");
const STRONG_PREFERRED = const Strength(1, "strongPreferred");
const WEAKEST = const Strength(6, "weakest");
const WEAK_DEFAULT = const Strength(5, "weakDefault");
const int BACKWARD = 0;
const int FORWARD = 2;
const int NONE = 1;
late Planner planner;
main() {}
void chainTest(int n) {}
void change(Variable v, int newValue) {}
void projectionTest(int n) {}
