Avoiding Enum generic-deriving boilerplate

In Haskell, I would do the following:

data SomethingA = Foo | Bar         deriving (Eq, Ord, Show, Bounded, Enum)
data SomethingB = Baz | Bop | Bloop deriving (Eq, Ord, Show, Bounded, Enum)

To accomplish the same thing in PureScript, I do all of this:

data SomethingA = Foo | Bar
data SomethingB = Baz | Bop | Bloop
derive instance _0_ ∷ Generic SomethingA _
derive instance _1_ ∷ Eq SomethingA
derive instance _2_ ∷ Ord SomethingA
instance _3_ ∷ Show SomethingA where
  show = genericShow
instance _4_ ∷ Enum SomethingA where
  succ = genericSucc
  pred = genericPred
instance _5_ ∷ Bounded SomethingA where
  top = genericTop
  bottom = genericBottom
instance _6_ ∷ BoundedEnum SomethingA where
  cardinality = genericCardinality
  toEnum = genericToEnum
  fromEnum = genericFromEnum
derive instance _7_ ∷ Generic SomethingB _
derive instance _8_ ∷ Eq SomethingB
derive instance _9_ ∷ Ord SomethingB
instance _10_ ∷ Show SomethingB where
  show = genericShow
instance _11_ ∷ Enum SomethingB where
  succ = genericSucc
  pred = genericPred
instance _12_ ∷ Bounded SomethingB where
  top = genericTop
  bottom = genericBottom
instance _13_ ∷ BoundedEnum SomethingB where
  cardinality = genericCardinality
  toEnum = genericToEnum
  fromEnum = genericFromEnum

Two simple, readable statements become thirty-two lines of mush with fourteen useless function names. I find myself using this pattern all the time in order to collect everything with enumFromTo bottom top. Is there a better way?

4 Likes