	direction: Direction;

	initialContexts(location: GraphNode<Node>): TContext[];

	bottom: TEnvironment;
	isEntry?(location: GraphNode<Node>): boolean;
	entry(location: GraphNode<Node>): TEnvironment;
	join(a: TEnvironment, b: TEnvironment): TEnvironment;
	equal(a: TEnvironment, b: TEnvironment): boolean;

	kinds: GraphNodeKind[];
	filter(node: Node): node is TNode;