using singleton list to save memory
using enummap instead enum