variant QueryIterator = LeafIterator | UnionIterator; record LeafIterator(...); record UnionIterator( left: UniqueValue[QueryIterator], right: UniqueValue[QueryIterator], ); overload hasNext?(i:QueryIterator) = hasNext?(*i); overload next(i:QueryIterator) = next(*i); overload hasNext?(i:UnionIterator) = hasNext?(i.left^) or hasNext?(i.right^); overload next(i:UnionIterator) = unionNext(i.left^, i.right^); private unionNext(left, right) = ...;