btw, this file should have guards to avoid duplicate type definitions