library;
import self as self;
import "dart:core" as core;

class DeltaBlue extends core::Object {
  synthetic constructor •() → self::DeltaBlue*
    ;
  method run() → void
    ;
}
class Strength extends core::Object {
  final field core::int* value;
  final field core::String* name;
  const constructor •(core::int* value, core::String* name) → self::Strength*
    : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
    ;
  method nextWeaker() → self::Strength*
    ;
  static method stronger(self::Strength* s1, self::Strength* s2) → core::bool*
    ;
  static method weaker(self::Strength* s1, self::Strength* s2) → core::bool*
    ;
  static method weakest(self::Strength* s1, self::Strength* s2) → self::Strength*
    ;
  static method strongest(self::Strength* s1, self::Strength* s2) → self::Strength*
    ;
}
abstract class Constraint extends core::Object {
  final field self::Strength* strength;
  const constructor •(self::Strength* strength) → self::Constraint*
    : self::Constraint::strength = strength, super core::Object::•()
    ;
  abstract method isSatisfied() → core::bool*;
  abstract method markUnsatisfied() → void;
  abstract method addToGraph() → void;
  abstract method removeFromGraph() → void;
  abstract method chooseMethod(core::int* mark) → void;
  abstract method markInputs(core::int* mark) → void;
  abstract method inputsKnown(core::int* mark) → core::bool*;
  abstract method output() → self::Variable*;
  abstract method execute() → void;
  abstract method recalculate() → void;
  method addConstraint() → void
    ;
  method satisfy(dynamic mark) → self::Constraint*
    ;
  method destroyConstraint() → void
    ;
  method isInput() → core::bool*
    ;
}
abstract class UnaryConstraint extends self::Constraint {
  final field self::Variable* myOutput;
  field core::bool* satisfied;
  constructor •(self::Variable* myOutput, self::Strength* strength) → self::UnaryConstraint*
    ;
  method addToGraph() → void
    ;
  method chooseMethod(core::int* mark) → void
    ;
  method isSatisfied() → core::bool*
    ;
  method markInputs(core::int* mark) → void
    ;
  method output() → self::Variable*
    ;
  method recalculate() → void
    ;
  method markUnsatisfied() → void
    ;
  method inputsKnown(core::int* mark) → core::bool*
    ;
  method removeFromGraph() → void
    ;
}
class StayConstraint extends self::UnaryConstraint {
  constructor •(self::Variable* v, self::Strength* str) → self::StayConstraint*
    ;
  method execute() → void
    ;
}
class EditConstraint extends self::UnaryConstraint {
  constructor •(self::Variable* v, self::Strength* str) → self::EditConstraint*
    ;
  method isInput() → core::bool*
    ;
  method execute() → void
    ;
}
abstract class BinaryConstraint extends self::Constraint {
  field self::Variable* v1;
  field self::Variable* v2;
  field core::int* direction;
  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::BinaryConstraint*
    ;
  method chooseMethod(core::int* mark) → void
    ;
  method addToGraph() → void
    ;
  method isSatisfied() → core::bool*
    ;
  method markInputs(core::int* mark) → void
    ;
  method input() → self::Variable*
    ;
  method output() → self::Variable*
    ;
  method recalculate() → void
    ;
  method markUnsatisfied() → void
    ;
  method inputsKnown(core::int* mark) → core::bool*
    ;
  method removeFromGraph() → void
    ;
}
class ScaleConstraint extends self::BinaryConstraint {
  final field self::Variable* scale;
  final field self::Variable* offset;
  constructor •(self::Variable* src, self::Variable* scale, self::Variable* offset, self::Variable* dest, self::Strength* strength) → self::ScaleConstraint*
    ;
  method addToGraph() → void
    ;
  method removeFromGraph() → void
    ;
  method markInputs(core::int* mark) → void
    ;
  method execute() → void
    ;
  method recalculate() → void
    ;
}
class EqualityConstraint extends self::BinaryConstraint {
  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::EqualityConstraint*
    ;
  method execute() → void
    ;
}
class Variable extends core::Object {
  field core::List<self::Constraint*>* constraints;
  field self::Constraint* determinedBy;
  field core::int* mark;
  field self::Strength* walkStrength;
  field core::bool* stay;
  field core::int* value;
  final field core::String* name;
  constructor •(core::String* name, core::int* value) → self::Variable*
    ;
  method addConstraint(self::Constraint* c) → void
    ;
  method removeConstraint(self::Constraint* c) → void
    ;
}
class Planner extends core::Object {
  field core::int* currentMark;
  synthetic constructor •() → self::Planner*
    ;
  method incrementalAdd(self::Constraint* c) → void
    ;
  method incrementalRemove(self::Constraint* c) → void
    ;
  method newMark() → core::int*
    ;
  method makePlan(core::List<self::Constraint*>* sources) → self::Plan*
    ;
  method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) → self::Plan*
    ;
  method addPropagate(self::Constraint* c, core::int* mark) → core::bool*
    ;
  method removePropagateFrom(self::Variable* out) → core::List<self::Constraint*>*
    ;
  method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) → void
    ;
}
class Plan extends core::Object {
  field core::List<self::Constraint*>* list;
  synthetic constructor •() → self::Plan*
    ;
  method addConstraint(self::Constraint* c) → void
    ;
  method size() → core::int*
    ;
  method execute() → void
    ;
}
static const field dynamic REQUIRED = const self::Strength::•(0, "required");
static const field dynamic STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
static const field dynamic PREFERRED = const self::Strength::•(2, "preferred");
static const field dynamic STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
static const field dynamic NORMAL = const self::Strength::•(4, "normal");
static const field dynamic WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
static const field dynamic WEAKEST = const self::Strength::•(6, "weakest");
static const field core::int* NONE = 1;
static const field core::int* FORWARD = 2;
static const field core::int* BACKWARD = 0;
static field self::Planner* planner;
static method main() → dynamic
  ;
static method chainTest(core::int* n) → void
  ;
static method projectionTest(core::int* n) → void
  ;
static method change(self::Variable* v, core::int* newValue) → void
  ;
