{-# LANGUAGE ExistentialQuantification, FlexibleInstances, MultiParamTypeClasses, Rank2Types #-} module Test.Bdd.Internal ( GivenStore(..) ,GivenWithTeardown ,StorableAsGivenWithTeardown(..) ) where data GivenStore m = forall a. GivenStore (m a, a -> m ()) type GivenWithTeardown m = Monad m => [GivenStore m] class StorableAsGivenWithTeardown m g where mkGiven :: g -> GivenWithTeardown m instance StorableAsGivenWithTeardown m (m a) where mkGiven g = [GivenStore (g,const (return ()))] instance StorableAsGivenWithTeardown m (m a, a -> m ()) where mkGiven = return . GivenStore