module NoSlow.Main.Util ( kernel, kernels, kgroup, klist, KTree(..), (>++<), qualify ) where import NoSlow.Util.Base import NoSlow.Util.Computation import Criterion.Main ( Benchmark, whnf, bench, bgroup ) -- NOTE: The deepSeq on the result is introduced by the TH code. GHC 6.12 (and -- sometimes 6.13) won't optimise it otherwise. -- See http://hackage.haskell.org/trac/ghc/ticket/3772 kernel :: TestData arg => String -> (Ty a -> arg -> ()) -> Ty a -> Int -> Benchmark {-# NOINLINE kernel #-} kernel s f = \t n -> let x = generateData n in x `deepSeq` bench s (whnf (f t) x) kernels :: String -> Ty a -> [Ty a -> Int -> Benchmark] -> Int -> Benchmark kernels s t bs n = bgroup s [b t n | b <- bs] data KTree = KGroup String [KTree] | KModule String String kgroup :: String -> [Int -> Benchmark] -> Int -> Benchmark kgroup s fs n = bgroup s [f n | f <- fs] klist :: [Int -> Benchmark] -> Int -> [Benchmark] klist fs n = [f n | f <- fs] infixr 5 >++< (>++<) :: (Int -> [Benchmark]) -> (Int -> [Benchmark]) -> Int -> [Benchmark] (>++<) f g n = f n ++ g n qualify :: String -> KTree -> KTree qualify p (KGroup s ts) = KGroup s (map (qualify p) ts) qualify p (KModule s m) = KModule s (p ++ '.' : m)