content: {-# LANGUAGE ConstraintKinds #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE GADTs #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  {-# LANGUAGE RankNTypes #-}
  
  module Main (main) where
  
  import Reflex.Test
  
  import Data.Bifunctor
  import Data.Functor
  import Data.List
  import qualified Reflex.Bench.Focused as Focused
  import qualified Reflex.Test.Micro as Micro
  
  import System.Environment
  import System.Exit
  
  import Prelude
  
  matchPrefixes :: [String] -> (String -> Bool)
  matchPrefixes []   = const True
  matchPrefixes args = \name -> any (`isPrefixOf` name) args
  
  
  main :: IO ()
  main = do
    args <- getArgs
  
    case args of
      ["--list"] -> mapM_ putStrLn (fst <$> allTests) >> exitWith (ExitFailure 1)
      _          -> case filter (matchPrefixes args . fst) allTests of
                      []    -> putStrLn "filter did not match any tests" >> exitWith (ExitFailure 1)
                      tests -> runTests tests
  
    where
      allTests = concat
       [ makeGroup "micro" Micro.testCases
       , makeGroup "subscribing (100,40)" (Focused.subscribing 100 40)
       , makeGroup "firing 1000" (Focused.firing 1000)
       , makeGroup "merge 100" (Focused.merging 100)
       , makeGroup "fan 50" (Focused.fans 50)
       ]
  
      makeGroup name tests = first (\test -> intercalate "/" [name, test]) <$> tests
  