goblins-0.2.0.0: Genetic algorithm based randomised testing
Safe HaskellNone
LanguageHaskell2010

Test.Goblin.TH

Description

Template Haskell derivation functions for the goblin-related typeclasses.

Synopsis

Documentation

deriveGoblin :: Name -> Q [Dec] Source #

Derive a Goblin instance for datatypes which have Goblin and AddShrinks instances for their enclosed fields. tinkers recursively with fields of a datatype, then uses <$$> and <**> to map the constructor over the tinkered fields. conjures by using <$> and <*> over recursive calls to conjure.

  deriveGoblin ''(,)
  ======>
  instance (Goblin g a,
            AddShrinks a,
            Goblin g b,
            AddShrinks b) =>
           Goblin g ((,) a b) where
    tinker gen
      = tinkerRummagedOrConjureOrSave
          ((( a b -> ((,) a) b)
             $$ tinker (( ((,) a _) -> a) $ gen))
             ** tinker (( ((,) _ b) -> b) $ gen))
    conjure = (saveInBagOfTricks =(((,) <$ conjure) * conjure))

deriveAddShrinks :: Name -> Q [Dec] Source #

Derive an AddShrinks instance for datatypes which have AddShrinks instances for their enclosed fields. Simply performs structural recursion on fields, then uses <$> and <*> to apply the constructor over the addShrinks of the fields.

  deriveAddShrinks ''(,)
  ======>
  instance (AddShrinks a, AddShrinks b) =>
           AddShrinks ((,) a b) where
    addShrinks ((,) x y)
      = ((( x y -> ((,) x) y)
           $ addShrinks x)
           * addShrinks y)

deriveSeedGoblin :: Name -> Q [Dec] Source #

Derive a SeedGoblin instance which calls saveInBagOfTricks on the argument then recurs structurally on fields.

  deriveSeedGoblin ''(,)
  ======>
  instance (SeedGoblin a,
            Typeable a,
            SeedGoblin b,
            Typeable b) =>
           SeedGoblin ((,) a b) where
    seeder p@((,) x y)
      = do (() <$ saveInBagOfTricks p)
           seeder x
           seeder y