packages feed

approx-rand-test-0.2.1: utils/diagrams/ChartBackend.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}

module ChartBackend (
  backendFormats,
  writeWithBackend
) where

import           Control.Lens.Setter ((.~))
import           Control.Monad (void)
import           Data.Default
import           Data.Default.Class ()
import qualified Graphics.Rendering.Chart as Chart
import qualified Graphics.Rendering.Chart.Backend.Diagrams as DiagramsChart
import qualified System.FilePath.Posix as FP
import           System.IO (hPutStrLn, stderr)

type RenderFunction a = Chart.Renderable a -> FilePath -> IO (Chart.PickFn a)

instance Default DiagramsChart.FileOptions where
  def = DiagramsChart.FileOptions (800, 600) DiagramsChart.SVG def

renderFunctions :: [(String, RenderFunction a)]
renderFunctions =
  [ (".eps", DiagramsChart.renderableToFile $
      DiagramsChart.fo_format .~ DiagramsChart.EPS $ def),
    (".svg", DiagramsChart.renderableToFile def) ]

backendFormats :: [String]
backendFormats = map fst renderFunctions

writeWithBackend :: Chart.Renderable () -> FP.FilePath -> IO ()
writeWithBackend renderable path =
  case lookup (snd $ FP.splitExtension path) renderFunctions of
    Just f  -> void $ f renderable path
    Nothing ->
      hPutStrLn stderr "Unknown output format!"