{- |
This class allows gives a uniform interface to plotting
@Plot@, @Frame@ and @MultiPlot@.
-}
module Graphics.Gnuplot.Display where

import qualified Graphics.Gnuplot.Private.FrameOption as Option

import qualified Data.Map as Map
import qualified Data.Monoid.State as State
import Data.Monoid (Monoid, mempty, mappend, )


-- * User front-end

newtype Script =
   Script {
      runScript :: State.T (Int, OptionSet) Body
   }

data Body =
   Body {
      files :: [File],
      commands :: [String]
   }

type OptionSet = Map.Map Option.T [String]

data File =
   File {
      filename :: FilePath,
      content :: String
   }

writeData :: File -> IO ()
writeData (File fn cont) =
   writeFile fn cont


{-
Could also be implemented with Control.Monad.Trans.State:
mappend = liftA2 mappend
-}
instance Monoid Script where
   mempty = Script mempty
   mappend (Script b0) (Script b1) =
      Script (mappend b0 b1)

{-
Could also be implemented with Control.Monad.Trans.State:
mappend = liftA2 mappend
-}
instance Monoid Body where
   mempty = Body mempty mempty
   mappend (Body f0 c0) (Body f1 c1) =
      Body (mappend f0 f1) (mappend c0 c1)

class C gfx where
   toScript :: gfx -> Script
