more general LTc and use GADTs to enfore structure