module Graphics.Gnuplot.Private.Graph2D where import qualified Graphics.Gnuplot.Private.FrameOptionSet as OptionSet import qualified Graphics.Gnuplot.Private.FrameOption as Option import qualified Graphics.Gnuplot.Private.LineSpecification as LineSpec import qualified Graphics.Gnuplot.Private.Graph2DType as GraphType import qualified Graphics.Gnuplot.Private.Graph as Graph import qualified Graphics.Gnuplot.Value.Atom as Atom import qualified Data.Map as Map import qualified Data.List as List import Prelude hiding (lines, ) data T x y = Cons { column_ :: Column, type_ :: Type, lineSpec_ :: LineSpec.T } type Column = [Int] type Type = String columnToString :: Column -> String columnToString = concat . List.intersperse ":" . map show toString :: T x y -> String toString (Cons c t l) = "using " ++ columnToString c ++ " with " ++ t ++ " " ++ LineSpec.toString l type AxisOption x y a = OptionSet.T (T x y) -> (Atom.OptionSet, a) defltOptions :: (Atom.C x, Atom.C y) => OptionSet.T (T x y) defltOptions = let optX :: Atom.C x => AxisOption x y x optX _ = Atom.options optY :: Atom.C y => AxisOption x y y optY _ = Atom.options mk :: Option.T -> Option.T -> (Atom.OptionSet, a) -> [(Option.T, [String])] mk optData optFormat op = let opts = fst op in (optData, Atom.optData opts) : (optFormat, Atom.optFormat opts) : Atom.optOthers opts result = OptionSet.Cons $ flip Map.union OptionSet.deflt $ Map.fromList $ mk Option.xData Option.xFormat (optX result) ++ mk Option.yData Option.yFormat (optY result) ++ (Option.zData, []) : (Option.zFormat, []) : [] in result instance (Atom.C x, Atom.C y) => Graph.C (T x y) where command _ = "plot" toString = toString defltOptions = defltOptions deflt :: GraphType.T x y a -> Column -> T x y deflt t c = Cons c (GraphType.toString t) LineSpec.deflt typ :: Type -> T x y -> T x y typ t gr = gr{type_ = t} lineSpec :: LineSpec.T -> T x y -> T x y lineSpec ls gr = gr{lineSpec_ = ls}