Library for modeling overlapping hierarchy, in which nodes can have multiple parents.
Equivalent of transitively reduced directed acyclic graph, in which edges represent parenthood.
A B F G
\ | | /
C H
/ | | \
D E I J
const hierarchy = new OverlappingHierarchy()
hierarchy.add('A')
hierarchy.add('B')
hierarchy.attach('A', 'C')
hierarchy.attach('B', 'C')
hierarchy.attach('C', 'D')
hierarchy.attach('C', 'E')
hierarchy.add('F')
hierarchy.add('G')
hierarchy.attach('F', 'H')
hierarchy.attach('G', 'H')
hierarchy.attach('H', 'I')
hierarchy.attach('H', 'J')
const empty = new OverlappingHierarchy()
const cloned = new OverlappingHierarchy(source)
hierarchy.add(node)
hierarchy.attach(parent, child)
hierarchy.detach(parent, child)
hierarchy.delete(node)
hierarchy.nodes()
hierarchy.hierarchs()
hierarchy.children(parent)
hierarchy.parents(child)
hierarchy.descendants(ancestor)
hierarchy.ancestors(descendant)
hierarchy.attach('A', 'A') // LoopError: Cannot add node to itself
hierarchy.attach('D', 'A') // CycleError: Cannot add ancestor as a child
hierarchy.attach('A', 'D') // TransitiveReductionError: Cannot attach non-child descendant as a child
hierarchy.attach('A', 'B') // TransitiveReductionError: Cannot attach child whose descendant is a child of the parent