no liftM left in code
really top-down structuring