upto Algebraic Data Types