I have a cabal package that exports a type NBT
which might be useful for other developers. I've gone through the trouble of defining an Arbitrary
instance for my type, and it would be a shame to not offer it to other developers for testing their code that integrates my work.
However, I want to avoid situations where my instance might get in the way. Perhaps the other developer has a different idea for what the Arbitrary
instance should be. Perhaps my package's dependency on a particular version of QuickCheck might interfere with or be unwanted in the dependencies of the client project.
My ideas, in no particular order, are:
- Leave the
Arbitrary
instance next to the definition of the type, and let clients deal with shadowing the instance or overriding the QuickCheck version number. - Make the
Arbitrary
instance an orphan instance in a separate module within the same package, sayData.NBT.Arbitrary
. The dependency on QuickCheck for the overall package remains. - Offer the
Arbitrary
instance in a totally separate package, so that it can be listed as a separate test dependency for client projects. - Conditionally include both the
Arbitrary
instance and the QuickCheck dependency in the main package, but only if a flag like-ftest
is set.
I've seen combinations of all of these used in other libraries, but haven't found any consensus on which works best. I want to try and get it right before uploading to Hackage.