import vector:* import queue:* import map:* import set:* fun poset(): poset { var to_ret.construct(): poset return to_ret } obj poset (Object) { var adj_matrix: map> fun construct(): *poset { adj_matrix.construct() return this } fun copy_construct(old: *poset) { adj_matrix.copy_construct(&old->adj_matrix) } fun operator=(other: ref poset) { destruct() copy_construct(&other) } fun destruct() { adj_matrix.destruct() } fun add_relationship(first: T, second: T) { if (!adj_matrix.contains_key(first)) add_vertex(first) if (!adj_matrix.contains_key(second)) add_vertex(second) adj_matrix[first].add(second) } fun add_vertex(vertex: T) { if (adj_matrix.contains_key(vertex)) return; adj_matrix.set(vertex, set()) } fun get_depends_on(vertex: T): set { var depends_on = set() adj_matrix.for_each(fun(key: T, value: set) { if (value.contains(vertex)) depends_on.add(key) }) return depends_on } fun get_sorted(): vector { var sorted = vector() var to_do = queue() // because we're going to destructivly update var temp_adj_matrix = adj_matrix temp_adj_matrix.for_each(fun(key: T, value: set) if (temp_adj_matrix[key].size() == 0) to_do.push(key);) while (!to_do.empty()) { var current = to_do.pop() sorted.add(current) get_depends_on(current).for_each(fun(vert: T) { temp_adj_matrix[vert].remove(current) /*print(vert); print(" now has "); print(temp_adj_matrix[vert].size()); println(" dependencies")*/ if (temp_adj_matrix[vert].size() == 0) to_do.push(vert) }) } return sorted } }