content: {-# LANGUAGE ConstraintKinds #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE GADTs #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  {-# LANGUAGE RankNTypes #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE UndecidableInstances #-}
  module Reflex.TestPlan
    ( TestPlan(..)
  
    , TestCase (..)
    , testE, testB
    , TestE, TestB
  
    , planList
  
    ) where
  
  import Control.DeepSeq
  import Control.Monad.Fix
  import Data.Word
  import Reflex.Class
  
  
  import Prelude
  
  class (Reflex t, MonadHold t m, MonadFix m) => TestPlan t m where
    -- | Specify a plan of an input Event firing
    -- Occurrences must be in the future (i.e. Time > 0)
    -- Initial specification is
  
    plan :: [(Word, a)] -> m (Event t a)
  
  
  planList :: TestPlan t m => [a] -> m (Event t a)
  planList xs = plan $ zip [1..] xs
  
  type TestE a = forall t m. TestPlan t m => m (Event t a)
  type TestB a = forall t m. TestPlan t m => m (Behavior t a)
  
  data TestCase  where
    TestE  :: (Show a, Eq a, NFData a) => TestE a -> TestCase
    TestB  :: (Show a, Eq a, NFData a) => TestB a -> TestCase
  
  -- Helpers to declare test cases
  testE :: (Eq a, Show a, NFData a) => String -> TestE a -> (String, TestCase)
  testE name test = (name, TestE test)
  
  testB :: (Eq a, Show a, NFData a) => String -> TestB a -> (String, TestCase)
  testB name test = (name, TestB test)
  
  