content: {-|
  Functions to build Traces from standard data. Generated traces can still be
  customized with lenses.
  -}
  module Graphics.Plotly.Simple where
  
  import Data.Aeson
  import Data.Text (Text)
  import Lens.Micro
  
  import Graphics.Plotly.Base
  
  
  -- |Generate a scatterplot from pairs
  scatterPlot :: (ToJSON a, ToJSON b) => [(a, b)] -> Trace
  scatterPlot xys = scatter
      & x     ?~ fmap (toJSON . fst) xys
      & y     ?~ fmap (toJSON . snd) xys
      & mode  ?~ [Markers]
  
  
  -- |Generate a line plot from pairs
  linePlot :: (ToJSON a, ToJSON b) => [(a, b)] -> Trace
  linePlot xys = scatter
      & x     ?~ fmap (toJSON . fst) xys
      & y     ?~ fmap (toJSON . snd) xys
      & mode  ?~ [Lines]
  
  
  -- |Generate a horizontal bar chart from pairs of text and value.
  hbarChart :: [(Text, Double)] -> Trace
  hbarChart tvs = bars
      & y             ?~ fmap (toJSON . fst) tvs
      & x             ?~ fmap (toJSON . snd) tvs
      & orientation   ?~ Horizontal
  
  
  -- |Generate a horizontal bar chart from pairs of text and value.
  vbarChart :: [(Text, Double)] -> Trace
  vbarChart tvs = bars
      & x             ?~ fmap (toJSON . fst) tvs
      & y             ?~ fmap (toJSON . snd) tvs
      & orientation   ?~ Vertical
  
  
  -- |Generate a fan plot with a given width in standard deviations and
  --  (x,(y,sd)) data
  fanPlot :: Double -> [(Double, (Double, Double))] -> Trace
  fanPlot sdCount tmnsds = scatter
      & x     ?~ fmap toJSON xs
      & y     ?~ fmap toJSON ys
      & fill  ?~ ToZeroY
    where
      xs = fmap fst tmnsds ++ reverse (fmap fst tmnsds)
      ys = fmap ((\(m, sd) -> m + sdCount * sd) . snd) tmnsds
              ++ reverse (fmap ((\(m, sd) -> m - sdCount * sd) . snd) tmnsds)
  
  