I am writing graphics code, and there is a pattern that I am repeating. I imagine that there could be some way to automate the code that I am creating.
I have a collection of type classes like the ones below (minus fundeps, and other elements to make it compile).
class Vertex a ...
class (Coordinate b, Vertex a) => Positionable a b where
getPosition :: a -> b
class (Vertex a) => Colorable a where
getColor :: a -> Color
class (Vertex a) => Textureable a where
getUVs :: a -> (Double, Double)
etc... Basically I have a bunch of type classes with one method getSomeType.
The following would be an instance of all of the type classes:
data ColorVertex = ColorVertex Cart3Coordinate Color (Double, Double)
Additionally I have collection type classes as follows:
class (Coordinate b) => PositionCollection a b where
getPositionList :: a -> [b]
class ColorList a where
getColorList :: a -> [Color]
class UVList a where
getUVList :: a -> [(Double, Double)]
So, for every getSomeType class, there is a getSomeTypeList class. An instance of these types would look like
data StreamCollection3 = StreamCollection3 [Cart3Coordinate] [Color] [(Double, Double)]
add it would also an instance of the following class, and I would like to figure out how to generate the functions for the class.
class (Vertex b) => VertexCollection a b where
getElement :: a -> Int -> b
getVertexList :: a -> [b]
fromVertexList :: [b] -> a
The Vertex in this case would be ColorVertex.
I was thinking I could reduce the code by making the classes
class Gets a b where
gets :: a -> b
class GetsList a b where
getsList :: a -> [b]
But I think I could go further. I'm wondering if there is a way to completely automate the construction of these classes, data types and methods, such that all I would provide is definition of the element type such as
data PositionVertex = PositionVertex Cart3Coordinate
and everything else would get generated.
I can see how I would write code to generate this. Is the time to learn Template Haskell, or is there another way to generate my boilerplate?
-Jonathan Fischoff