supports union with arbitrarily many argument