1
1
mirror of https://github.com/anoma/juvix.git synced 2024-09-11 08:15:41 +03:00
juvix/bench/Base.hs
2023-01-05 17:48:26 +01:00

123 lines
3.0 KiB
Haskell

module Base where
import Data.Colour
import Data.Colour.SRGB
import Development.Shake hiding ((<//>))
import Juvix.Extra.Paths
import Juvix.Prelude
import Prelude (Show (show))
root :: Path Abs Dir
root = relToProject $(mkRelDir "tests/benchmark")
resultsDir :: Path Abs Dir
resultsDir = relToProject $(mkRelDir ".benchmark-results")
resultDirs :: [Path Abs Dir]
resultDirs = [binDir, plotDir, csvDir]
binDir :: Path Abs Dir
binDir = resultsDir <//> $(mkRelDir "bin")
plotDir :: Path Abs Dir
plotDir = resultsDir <//> $(mkRelDir "plot")
csvDir :: Path Abs Dir
csvDir = resultsDir <//> $(mkRelDir "csv")
-- | e.g. 0xf0f8ff (format supported by gnuplot)
showColour :: Colour Double -> Text
showColour = pack . ("0x" <>) . dropExact 1 . sRGB24show
data Lang
= Ocaml
| Haskell
| C
| Juvix
| Runtime
| Core
deriving stock (Eq)
instance Show Lang where
show = \case
Ocaml -> "ocaml"
Haskell -> "haskell"
C -> "c"
Juvix -> "juvix"
Runtime -> "runtime"
Core -> "core"
langPath :: Lang -> Path Rel Dir
langPath = relDir . Prelude.show
langFile :: Lang -> Path Rel File
langFile = relFile . Prelude.show
langExtension :: Lang -> String
langExtension = \case
Ocaml -> ".ml"
Haskell -> ".hs"
C -> ".c"
Juvix -> ".juvix"
Runtime -> ".c"
Core -> ".jvc"
data Variant = Variant
{ _variantTitle :: Maybe String,
_variantLanguage :: Lang,
_variantExtensions :: [String],
_variantColor :: Colour Double,
_variantRun :: Path Abs File -> IO (),
_variantBuild :: BuildArgs -> Action ()
}
data BuildArgs = BuildArgs
{ _buildSrc :: Path Abs File,
_buildOutDir :: Path Abs Dir
}
data Suite = Suite
{ _suiteTitle :: String,
_suiteVariants :: [Variant]
}
makeLenses ''Suite
makeLenses ''BuildArgs
makeLenses ''Variant
gnuplotFile :: Path Abs File
gnuplotFile = relToProject $(mkRelFile "gnuplot/bars.gp")
suitePlotFile :: Suite -> Path Abs File
suitePlotFile s = plotDir <//> suiteBaseFile s
suitePdfFile :: Suite -> Path Abs File
suitePdfFile s = addExtension' ".pdf" (suitePlotFile s)
suiteSvgFile :: Suite -> Path Abs File
suiteSvgFile s = addExtension' ".svg" (suitePlotFile s)
suiteCsvFile :: Suite -> Path Abs File
suiteCsvFile s = addExtension' ".csv" (csvDir <//> suiteBaseFile s)
suiteSrcDir :: Suite -> Path Abs Dir
suiteSrcDir s = root <//> relDir (s ^. suiteTitle)
suiteBaseFile :: Suite -> Path Rel File
suiteBaseFile s = relFile (s ^. suiteTitle)
variantSrcDir :: Suite -> Variant -> Path Abs Dir
variantSrcDir s v = suiteSrcDir s <//> langPath (v ^. variantLanguage)
suitePath :: Suite -> Path Rel Dir
suitePath s = relDir (s ^. suiteTitle)
variantBinDir :: Suite -> Variant -> Path Abs Dir
variantBinDir s v = binDir <//> suitePath s <//> langPath (v ^. variantLanguage)
variantBinFile :: Suite -> Variant -> Path Abs File
variantBinFile s v = variantBinDir s v <//> addExtensions' (v ^. variantExtensions) (suiteBaseFile s)
binFile :: BuildArgs -> [String] -> Path Abs File
binFile args ext = args ^. buildOutDir <//> replaceExtensions' ext (filename (args ^. buildSrc))