hlist implementation