almost compiles
needs type families :/