fun Node.removedWhen(expr: () -> ObservableValue) { val originalParent = parent val placeholder = Region() fun remove() { val index = Math.max(0, originalParent.childrenUnmodifiable.indexOf(this)) removeFromParent() originalParent.addChildIfPossible(placeholder, index) } fun add() { val index = Math.max(0, originalParent.childrenUnmodifiable.indexOf(placeholder)) removeFromParent() originalParent.addChildIfPossible(this, index) } fun op(remove: Boolean) = if (remove) remove() else add() val state = expr() state.onChange { op(it ?: false) } op(state.value) }