-----------------------------------------------------------------------------
-- |
-- Module      :  Test.StateMachine.TH
-- Copyright   :  (C) 2017, ATS Advanced Telematic Systems GmbH, Li-yao Xia
-- License     :  BSD-style (see the file LICENSE)
--
-- Maintainer  :  Li-yao Xia <lysxia@gmail.com>
-- Stability   :  provisional
-- Portability :  non-portable (GHC extensions)
--
-- Template Haskell functions to derive common type classes for
-- testing with quickcheck-state-machine.
--
-----------------------------------------------------------------------------

module Test.StateMachine.TH
  ( -- * Special classes for @Action@ types
    deriveTestClasses

    -- ** Components
  , deriveHClasses
  , deriveHFunctor
  , deriveHFoldable
  , deriveHTraversable
  , deriveConstructors

    -- * Show
  , deriveShows
  , deriveShow
  , deriveShowUntyped

    -- * Shrink
  , mkShrinker
  ) where

import           Language.Haskell.TH
                   (Dec, Name, Q)

import           Test.StateMachine.Types.Generics.TH
import           Test.StateMachine.Types.HFunctor.TH

-- | Derive instances of
-- 'Test.StateMachine.Types.HFunctor.HFunctor',
-- 'Test.StateMachine.Types.HFunctor.HFoldable',
-- 'Test.StateMachine.Types.HFunctor.HTraversable',
-- 'Test.StateMachine.Types.Generics.Constructor'.
deriveTestClasses :: Name -> Q [Dec]
deriveTestClasses = (fmap (fmap concat . sequence) . sequence)
  [ deriveHClasses
  , deriveConstructors
  ]