module Test.SBench.STerm
( CostCenter
, DataGen
, Algorithm
, Data
, Seed
, Test
, STerm (..)
, toData
, toNamedData
, toDataGen
, toAlgorithm
, (<$>)
, getImports
, makeSeeds
, makeIntSeeds
) where
import Data.List ( nub )
type CostCenter = String
type ModuleName = String
type TermName = String
data STerm a = T { stTerm :: a
, stName :: TermName
, stModules :: [ModuleName]
, stCC :: [CostCenter]
}
instance Show (STerm a) where
show t = stName t
type Algorithm a = STerm a
type DataGen a = STerm a
type Data a = STerm a
type Seed a = STerm a
type Test a b = Data a -> FilePath -> IO b
toAlgorithm :: (a -> b) -> ModuleName -> TermName -> CostCenter -> Algorithm (a -> b)
toAlgorithm alg mn tn cc = T alg (mn ++ "." ++ tn) [mn] [cc]
toDataGen :: (a -> b) -> ModuleName -> TermName -> Data (a -> b)
toDataGen f "" tn = T f tn [] []
toDataGen f mn tn = T f (mn ++ "." ++ tn) [mn] []
toData :: (Show a) => a -> STerm a
toData a = T a (show a) [] []
toNamedData :: (Show a) => a -> TermName -> STerm a
toNamedData a n = T a n [] []
makeSeeds :: (Show a, Integral a)
=> a
-> a
-> a
-> [Seed a]
makeSeeds min max steps = map toData [min, (min + ((max min) `div` steps)) .. max]
makeIntSeeds :: Int -> Int -> Int -> [Seed Int]
makeIntSeeds = makeSeeds
(<$>) :: STerm (a -> b) -> STerm a -> STerm b
(<$>) (T f sf ms1 cc1) (T a sa ms2 cc2) =
T (f a) (sf ++ " " ++ sa) (nub (ms1 ++ ms2)) (nub (cc1 ++ cc2))
getImports :: STerm a -> String
getImports = unlines . map ("import qualified " ++) . stModules