{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Test.Hspec.Control where

import Control.Monad.Base
import Control.Monad.Trans.Control
import Control.Monad.Trans.Writer
import Data.Functor (($>))
import Test.Hspec.Core.Spec

instance MonadBase IO (SpecM a) where
  liftBase = runIO

instance MonadBaseControl IO (SpecM a) where
  type StM (SpecM a) r = (r, [SpecTree a])
  liftBaseWith f = runIO (f runSpecM')
    where runSpecM' (SpecM specs) = runWriterT specs
  restoreM (r, specs) = fromSpecList specs $> r