uses array instead of frozenset