{-# LANGUAGE FlexibleContexts   #-}
{-# LANGUAGE FlexibleInstances  #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE TypeFamilies       #-}
{-# LANGUAGE TypeApplications   #-}

{-|
A limited Grammar of Graphics-like interface.

@
myPts :: [(Double, Double)]
myPts = [(1,2), (1.2, 3), (1.4,3.5)]



myTrace :: Trace
myTrace = points (aes & x .~ fst
                      & y .~ snd)
                 myPts
@
-}
module Graphics.Plotly.GoG where

import           Data.Aeson
import           Data.Text (Text)
import           Data.Time
import           Lens.Micro

import qualified Graphics.Plotly.Base as Plot


class ToJSON a => AxisValue a

instance AxisValue Double
instance AxisValue Float
instance AxisValue Text
instance AxisValue String
instance AxisValue Int
instance AxisValue Day

instance AxisValue a => AxisValue [a]

data RGB a = RGB a a a
data RGBA a = RGBA a a a a

instance ToJSON (RGB Int) where
  toJSON :: RGB Int -> Value
toJSON (RGB Int
r Int
g Int
b) = String -> Value
forall a. ToJSON a => a -> Value
toJSON (String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"rgb(",Int -> String
forall a. Show a => a -> String
show Int
r,String
",",Int -> String
forall a. Show a => a -> String
show Int
g, String
",", Int -> String
forall a. Show a => a -> String
show Int
b,String
")"]

instance ToJSON (RGB Double) where
  toJSON :: RGB Double -> Value
toJSON (RGB Double
r Double
g Double
b) = String -> Value
forall a. ToJSON a => a -> Value
toJSON (String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"rgb(",Double -> String
showd Double
r,String
",",Double -> String
showd Double
g, String
",", Double -> String
showd Double
b,String
")"]
   where showd :: Double -> String
showd = forall a. Show a => a -> String
show @Int(Int -> String) -> (Double -> Int) -> Double -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
floor (Double -> Int) -> (Double -> Double) -> Double -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
256)

instance ToJSON (RGBA Int) where
  toJSON :: RGBA Int -> Value
toJSON (RGBA Int
r Int
g Int
b Int
a) = String -> Value
forall a. ToJSON a => a -> Value
toJSON (String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"rgba(",Int -> String
forall a. Show a => a -> String
show Int
r,String
",",Int -> String
forall a. Show a => a -> String
show Int
g, String
",", Int -> String
forall a. Show a => a -> String
show Int
b,String
",", Int -> String
forall a. Show a => a -> String
show Int
a, String
")"]

instance ToJSON (RGBA Double) where
  toJSON :: RGBA Double -> Value
toJSON (RGBA Double
r Double
g Double
b Double
a) = String -> Value
forall a. ToJSON a => a -> Value
toJSON (String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"rgb(",Double -> String
showd Double
r,String
",",Double -> String
showd Double
g, String
",", Double -> String
showd Double
b,String
",", Double -> String
showd Double
a,String
")"]
   where showd :: Double -> String
showd = forall a. Show a => a -> String
show @Int(Int -> String) -> (Double -> Int) -> Double -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
floor (Double -> Int) -> (Double -> Double) -> Double -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
256)

class ToJSON a => IsColor a

instance IsColor Int
instance IsColor (RGB Int)
instance IsColor (RGB Double)
instance IsColor (RGBA Int)
instance IsColor (RGBA Double)

type family XVal a
type family YVal a
type family ZVal a
type family CVal a
type family SVal a

type instance XVal (x,y,z,c,s) = x
type instance YVal (x,y,z,c,s) = y
type instance ZVal (x,y,z,c,s) = z
type instance CVal (x,y,z,c,s) = c
type instance SVal (x,y,z,c,s) = s

data Aes t a = Aes
    { forall t a. Aes t a -> a -> XVal t
_x     :: a -> XVal t
    , forall t a. Aes t a -> a -> YVal t
_y     :: a -> YVal t
    , forall t a. Aes t a -> a -> ZVal t
_z     :: a -> ZVal t
    , forall t a. Aes t a -> Maybe (a -> CVal t)
_color :: Maybe (a -> CVal t)
    , forall t a. Aes t a -> Maybe (a -> SVal t)
_size  :: Maybe (a -> SVal t)
    }


aes :: Aes ((), (), (), (), ()) a
aes :: forall a. Aes ((), (), (), (), ()) a
aes = (a -> XVal ((), (), (), (), ()))
-> (a -> YVal ((), (), (), (), ()))
-> (a -> ZVal ((), (), (), (), ()))
-> Maybe (a -> CVal ((), (), (), (), ()))
-> Maybe (a -> SVal ((), (), (), (), ()))
-> Aes ((), (), (), (), ()) a
forall t a.
(a -> XVal t)
-> (a -> YVal t)
-> (a -> ZVal t)
-> Maybe (a -> CVal t)
-> Maybe (a -> SVal t)
-> Aes t a
Aes (() -> a -> ()
forall a b. a -> b -> a
const ()) (() -> a -> ()
forall a b. a -> b -> a
const ()) (() -> a -> ()
forall a b. a -> b -> a
const ()) Maybe (a -> CVal ((), (), (), (), ()))
forall a. Maybe a
Nothing Maybe (a -> SVal ((), (), (), (), ()))
forall a. Maybe a
Nothing


setx :: (AxisValue v)
    => Aes (vx,vy,vz,vc,vs) a -> (a -> v) -> Aes (v, vy, vz, vc, vs) a
setx :: forall v vx vy vz vc vs a.
AxisValue v =>
Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (v, vy, vz, vc, vs) a
setx (Aes a -> XVal (vx, vy, vz, vc, vs)
_ a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs) a -> v
f = (a -> XVal (v, vy, vz, vc, vs))
-> (a -> YVal (v, vy, vz, vc, vs))
-> (a -> ZVal (v, vy, vz, vc, vs))
-> Maybe (a -> CVal (v, vy, vz, vc, vs))
-> Maybe (a -> SVal (v, vy, vz, vc, vs))
-> Aes (v, vy, vz, vc, vs) a
forall t a.
(a -> XVal t)
-> (a -> YVal t)
-> (a -> ZVal t)
-> Maybe (a -> CVal t)
-> Maybe (a -> SVal t)
-> Aes t a
Aes a -> v
a -> XVal (v, vy, vz, vc, vs)
f a -> YVal (v, vy, vz, vc, vs)
a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (v, vy, vz, vc, vs)
a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (v, vy, vz, vc, vs))
Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (v, vy, vz, vc, vs))
Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs


x :: (AxisValue v)
    => Lens (Aes (vx,vy, vz, vc, vs) a) (Aes (v,vy, vz, vc, vs) a) (a -> vx) (a -> v)
x :: forall v vx vy vz vc vs a.
AxisValue v =>
Lens
  (Aes (vx, vy, vz, vc, vs) a)
  (Aes (v, vy, vz, vc, vs) a)
  (a -> vx)
  (a -> v)
x = (Aes (vx, vy, vz, vc, vs) a -> a -> vx)
-> (Aes (vx, vy, vz, vc, vs) a
    -> (a -> v) -> Aes (v, vy, vz, vc, vs) a)
-> Lens
     (Aes (vx, vy, vz, vc, vs) a)
     (Aes (v, vy, vz, vc, vs) a)
     (a -> vx)
     (a -> v)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Aes (vx, vy, vz, vc, vs) a -> a -> vx
forall t a. Aes t a -> a -> XVal t
_x Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (v, vy, vz, vc, vs) a
forall v vx vy vz vc vs a.
AxisValue v =>
Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (v, vy, vz, vc, vs) a
setx


sety :: (AxisValue v)
    => Aes (vx,vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, v, vz, vc, vs) a
sety :: forall v vx vy vz vc vs a.
AxisValue v =>
Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, v, vz, vc, vs) a
sety (Aes a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, vz, vc, vs)
_ a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs) a -> v
f = (a -> XVal (vx, v, vz, vc, vs))
-> (a -> YVal (vx, v, vz, vc, vs))
-> (a -> ZVal (vx, v, vz, vc, vs))
-> Maybe (a -> CVal (vx, v, vz, vc, vs))
-> Maybe (a -> SVal (vx, v, vz, vc, vs))
-> Aes (vx, v, vz, vc, vs) a
forall t a.
(a -> XVal t)
-> (a -> YVal t)
-> (a -> ZVal t)
-> Maybe (a -> CVal t)
-> Maybe (a -> SVal t)
-> Aes t a
Aes a -> XVal (vx, v, vz, vc, vs)
a -> XVal (vx, vy, vz, vc, vs)
fx a -> v
a -> YVal (vx, v, vz, vc, vs)
f a -> ZVal (vx, v, vz, vc, vs)
a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (vx, v, vz, vc, vs))
Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (vx, v, vz, vc, vs))
Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs


y :: (AxisValue v)
    => Lens (Aes (vx,vy, vz, vc, vs) a) (Aes (vx,v, vz, vc, vs) a) (a -> vy) (a -> v)
y :: forall v vx vy vz vc vs a.
AxisValue v =>
Lens
  (Aes (vx, vy, vz, vc, vs) a)
  (Aes (vx, v, vz, vc, vs) a)
  (a -> vy)
  (a -> v)
y = (Aes (vx, vy, vz, vc, vs) a -> a -> vy)
-> (Aes (vx, vy, vz, vc, vs) a
    -> (a -> v) -> Aes (vx, v, vz, vc, vs) a)
-> Lens
     (Aes (vx, vy, vz, vc, vs) a)
     (Aes (vx, v, vz, vc, vs) a)
     (a -> vy)
     (a -> v)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Aes (vx, vy, vz, vc, vs) a -> a -> vy
forall t a. Aes t a -> a -> YVal t
_y Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, v, vz, vc, vs) a
forall v vx vy vz vc vs a.
AxisValue v =>
Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, v, vz, vc, vs) a
sety

setz :: (AxisValue v)
    => Aes (vx,vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, vy, v, vc, vs) a
setz :: forall v vx vy vz vc vs a.
AxisValue v =>
Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, vy, v, vc, vs) a
setz (Aes a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (vx, vy, vz, vc, vs)
_ Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs) a -> v
f = (a -> XVal (vx, vy, v, vc, vs))
-> (a -> YVal (vx, vy, v, vc, vs))
-> (a -> ZVal (vx, vy, v, vc, vs))
-> Maybe (a -> CVal (vx, vy, v, vc, vs))
-> Maybe (a -> SVal (vx, vy, v, vc, vs))
-> Aes (vx, vy, v, vc, vs) a
forall t a.
(a -> XVal t)
-> (a -> YVal t)
-> (a -> ZVal t)
-> Maybe (a -> CVal t)
-> Maybe (a -> SVal t)
-> Aes t a
Aes a -> XVal (vx, vy, v, vc, vs)
a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, v, vc, vs)
a -> YVal (vx, vy, vz, vc, vs)
fy a -> v
a -> ZVal (vx, vy, v, vc, vs)
f Maybe (a -> CVal (vx, vy, v, vc, vs))
Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (vx, vy, v, vc, vs))
Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs


z :: (AxisValue v)
    => Lens (Aes (vx,vy, vz, vc, vs) a) (Aes (vx,vy, v, vc, vs) a) (a -> vz) (a -> v)
z :: forall v vx vy vz vc vs a.
AxisValue v =>
Lens
  (Aes (vx, vy, vz, vc, vs) a)
  (Aes (vx, vy, v, vc, vs) a)
  (a -> vz)
  (a -> v)
z = (Aes (vx, vy, vz, vc, vs) a -> a -> vz)
-> (Aes (vx, vy, vz, vc, vs) a
    -> (a -> v) -> Aes (vx, vy, v, vc, vs) a)
-> Lens
     (Aes (vx, vy, vz, vc, vs) a)
     (Aes (vx, vy, v, vc, vs) a)
     (a -> vz)
     (a -> v)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Aes (vx, vy, vz, vc, vs) a -> a -> vz
forall t a. Aes t a -> a -> ZVal t
_z Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, vy, v, vc, vs) a
forall v vx vy vz vc vs a.
AxisValue v =>
Aes (vx, vy, vz, vc, vs) a -> (a -> v) -> Aes (vx, vy, v, vc, vs) a
setz

setcol :: (IsColor v)
    => Aes (vx,vy, vz, vc, vs) a -> Maybe (a -> v) -> Aes (vx, vy, vz, v, vs) a
setcol :: forall v vx vy vz vc vs a.
IsColor v =>
Aes (vx, vy, vz, vc, vs) a
-> Maybe (a -> v) -> Aes (vx, vy, vz, v, vs) a
setcol (Aes a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (vx, vy, vz, vc, vs))
_ Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs) Maybe (a -> v)
f = (a -> XVal (vx, vy, vz, v, vs))
-> (a -> YVal (vx, vy, vz, v, vs))
-> (a -> ZVal (vx, vy, vz, v, vs))
-> Maybe (a -> CVal (vx, vy, vz, v, vs))
-> Maybe (a -> SVal (vx, vy, vz, v, vs))
-> Aes (vx, vy, vz, v, vs) a
forall t a.
(a -> XVal t)
-> (a -> YVal t)
-> (a -> ZVal t)
-> Maybe (a -> CVal t)
-> Maybe (a -> SVal t)
-> Aes t a
Aes a -> XVal (vx, vy, vz, v, vs)
a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, vz, v, vs)
a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (vx, vy, vz, v, vs)
a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> v)
Maybe (a -> CVal (vx, vy, vz, v, vs))
f Maybe (a -> SVal (vx, vy, vz, v, vs))
Maybe (a -> SVal (vx, vy, vz, vc, vs))
fs


color :: (IsColor v)
    => Lens (Aes (vx,vy, vz, vc, vs) a) (Aes (vx,vy,vz, v,vs) a) (Maybe (a -> vc)) (Maybe (a -> v))
color :: forall v vx vy vz vc vs a.
IsColor v =>
Lens
  (Aes (vx, vy, vz, vc, vs) a)
  (Aes (vx, vy, vz, v, vs) a)
  (Maybe (a -> vc))
  (Maybe (a -> v))
color = (Aes (vx, vy, vz, vc, vs) a -> Maybe (a -> vc))
-> (Aes (vx, vy, vz, vc, vs) a
    -> Maybe (a -> v) -> Aes (vx, vy, vz, v, vs) a)
-> Lens
     (Aes (vx, vy, vz, vc, vs) a)
     (Aes (vx, vy, vz, v, vs) a)
     (Maybe (a -> vc))
     (Maybe (a -> v))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Aes (vx, vy, vz, vc, vs) a -> Maybe (a -> vc)
forall t a. Aes t a -> Maybe (a -> CVal t)
_color Aes (vx, vy, vz, vc, vs) a
-> Maybe (a -> v) -> Aes (vx, vy, vz, v, vs) a
forall v vx vy vz vc vs a.
IsColor v =>
Aes (vx, vy, vz, vc, vs) a
-> Maybe (a -> v) -> Aes (vx, vy, vz, v, vs) a
setcol


setsize :: (AxisValue v, Num v)
    => Aes (vx,vy, vz, vc, vs) a -> Maybe (a -> v) -> Aes (vx, vy, vz, vc, v) a
setsize :: forall v vx vy vz vc vs a.
(AxisValue v, Num v) =>
Aes (vx, vy, vz, vc, vs) a
-> Maybe (a -> v) -> Aes (vx, vy, vz, vc, v) a
setsize (Aes a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc Maybe (a -> SVal (vx, vy, vz, vc, vs))
_) = (a -> XVal (vx, vy, vz, vc, v))
-> (a -> YVal (vx, vy, vz, vc, v))
-> (a -> ZVal (vx, vy, vz, vc, v))
-> Maybe (a -> CVal (vx, vy, vz, vc, v))
-> Maybe (a -> SVal (vx, vy, vz, vc, v))
-> Aes (vx, vy, vz, vc, v) a
forall t a.
(a -> XVal t)
-> (a -> YVal t)
-> (a -> ZVal t)
-> Maybe (a -> CVal t)
-> Maybe (a -> SVal t)
-> Aes t a
Aes a -> XVal (vx, vy, vz, vc, v)
a -> XVal (vx, vy, vz, vc, vs)
fx a -> YVal (vx, vy, vz, vc, v)
a -> YVal (vx, vy, vz, vc, vs)
fy a -> ZVal (vx, vy, vz, vc, v)
a -> ZVal (vx, vy, vz, vc, vs)
fz Maybe (a -> CVal (vx, vy, vz, vc, v))
Maybe (a -> CVal (vx, vy, vz, vc, vs))
fc


size :: (AxisValue v, Num v)
    => Lens (Aes (vx,vy, vz, vc, vs) a) (Aes (vx,vy,vz, vc,v) a) (Maybe (a -> vs)) (Maybe (a -> v))
size :: forall v vx vy vz vc vs a.
(AxisValue v, Num v) =>
Lens
  (Aes (vx, vy, vz, vc, vs) a)
  (Aes (vx, vy, vz, vc, v) a)
  (Maybe (a -> vs))
  (Maybe (a -> v))
size = (Aes (vx, vy, vz, vc, vs) a -> Maybe (a -> vs))
-> (Aes (vx, vy, vz, vc, vs) a
    -> Maybe (a -> v) -> Aes (vx, vy, vz, vc, v) a)
-> Lens
     (Aes (vx, vy, vz, vc, vs) a)
     (Aes (vx, vy, vz, vc, v) a)
     (Maybe (a -> vs))
     (Maybe (a -> v))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Aes (vx, vy, vz, vc, vs) a -> Maybe (a -> vs)
forall t a. Aes t a -> Maybe (a -> SVal t)
_size Aes (vx, vy, vz, vc, vs) a
-> Maybe (a -> v) -> Aes (vx, vy, vz, vc, v) a
forall v vx vy vz vc vs a.
(AxisValue v, Num v) =>
Aes (vx, vy, vz, vc, vs) a
-> Maybe (a -> v) -> Aes (vx, vy, vz, vc, v) a
setsize


points :: (AxisValue (XVal t), AxisValue (YVal t), ToJSON (CVal t), ToJSON (SVal t))
       => Aes t a -> [a] -> Plot.Trace
points :: forall t a.
(AxisValue (XVal t), AxisValue (YVal t), ToJSON (CVal t),
 ToJSON (SVal t)) =>
Aes t a -> [a] -> Trace
points Aes t a
a [a]
xs =  Maybe (a -> SVal t) -> Trace -> Trace
setSize (Aes t a -> Maybe (a -> SVal t)
forall t a. Aes t a -> Maybe (a -> SVal t)
_size Aes t a
a) (Trace -> Trace) -> Trace -> Trace
forall a b. (a -> b) -> a -> b
$ Maybe (a -> CVal t) -> Trace -> Trace
setColors (Aes t a -> Maybe (a -> CVal t)
forall t a. Aes t a -> Maybe (a -> CVal t)
_color Aes t a
a) (Trace -> Trace) -> Trace -> Trace
forall a b. (a -> b) -> a -> b
$ Trace
Plot.scatter
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.x ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (XVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (XVal t -> Value) -> (a -> XVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> XVal t
forall t a. Aes t a -> a -> XVal t
_x Aes t a
a) [a]
xs
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.y ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (YVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (YVal t -> Value) -> (a -> YVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> YVal t
forall t a. Aes t a -> a -> YVal t
_y Aes t a
a) [a]
xs
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Mode] -> Identity (Maybe [Mode]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Mode])
Plot.mode ((Maybe [Mode] -> Identity (Maybe [Mode]))
 -> Trace -> Identity Trace)
-> [Mode] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ [Mode
Plot.Markers]
  where setColors :: Maybe (a -> CVal t) -> Trace -> Trace
setColors Maybe (a -> CVal t)
Nothing Trace
p = Trace
p
        setColors (Just a -> CVal t
setC) Trace
p
          = Trace
p Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe Marker -> Identity (Maybe Marker))
-> Trace -> Identity Trace
Lens' Trace (Maybe Marker)
Plot.marker ((Maybe Marker -> Identity (Maybe Marker))
 -> Trace -> Identity Trace)
-> ((Maybe (ListOrElem Value)
     -> Identity (Maybe (ListOrElem Value)))
    -> Maybe Marker -> Identity (Maybe Marker))
-> (Maybe (ListOrElem Value)
    -> Identity (Maybe (ListOrElem Value)))
-> Trace
-> Identity Trace
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Marker -> Lens' (Maybe Marker) Marker
forall a. Eq a => a -> Lens' (Maybe a) a
non Marker
Plot.defMarker ((Marker -> Identity Marker)
 -> Maybe Marker -> Identity (Maybe Marker))
-> ((Maybe (ListOrElem Value)
     -> Identity (Maybe (ListOrElem Value)))
    -> Marker -> Identity Marker)
-> (Maybe (ListOrElem Value)
    -> Identity (Maybe (ListOrElem Value)))
-> Maybe Marker
-> Identity (Maybe Marker)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe (ListOrElem Value) -> Identity (Maybe (ListOrElem Value)))
-> Marker -> Identity Marker
Lens' Marker (Maybe (ListOrElem Value))
Plot.markercolor ((Maybe (ListOrElem Value) -> Identity (Maybe (ListOrElem Value)))
 -> Trace -> Identity Trace)
-> ListOrElem Value -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ [Value] -> ListOrElem Value
forall a. [a] -> ListOrElem a
Plot.List ((a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (CVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (CVal t -> Value) -> (a -> CVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> CVal t
setC) [a]
xs)
        setSize :: Maybe (a -> SVal t) -> Trace -> Trace
setSize Maybe (a -> SVal t)
Nothing Trace
p = Trace
p
        setSize (Just a -> SVal t
setS) Trace
p
          = Trace
p Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe Marker -> Identity (Maybe Marker))
-> Trace -> Identity Trace
Lens' Trace (Maybe Marker)
Plot.marker ((Maybe Marker -> Identity (Maybe Marker))
 -> Trace -> Identity Trace)
-> ((Maybe (ListOrElem Value)
     -> Identity (Maybe (ListOrElem Value)))
    -> Maybe Marker -> Identity (Maybe Marker))
-> (Maybe (ListOrElem Value)
    -> Identity (Maybe (ListOrElem Value)))
-> Trace
-> Identity Trace
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Marker -> Lens' (Maybe Marker) Marker
forall a. Eq a => a -> Lens' (Maybe a) a
non Marker
Plot.defMarker ((Marker -> Identity Marker)
 -> Maybe Marker -> Identity (Maybe Marker))
-> ((Maybe (ListOrElem Value)
     -> Identity (Maybe (ListOrElem Value)))
    -> Marker -> Identity Marker)
-> (Maybe (ListOrElem Value)
    -> Identity (Maybe (ListOrElem Value)))
-> Maybe Marker
-> Identity (Maybe Marker)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe (ListOrElem Value) -> Identity (Maybe (ListOrElem Value)))
-> Marker -> Identity Marker
Lens' Marker (Maybe (ListOrElem Value))
Plot.size ((Maybe (ListOrElem Value) -> Identity (Maybe (ListOrElem Value)))
 -> Trace -> Identity Trace)
-> ListOrElem Value -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ [Value] -> ListOrElem Value
forall a. [a] -> ListOrElem a
Plot.List ((a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (SVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (SVal t -> Value) -> (a -> SVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> SVal t
setS) [a]
xs)

line :: (AxisValue (XVal t), AxisValue (YVal t))
       => Aes t a -> [a] -> Plot.Trace
line :: forall t a.
(AxisValue (XVal t), AxisValue (YVal t)) =>
Aes t a -> [a] -> Trace
line Aes t a
a [a]
xs = Trace
Plot.scatter Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.x ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (XVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (XVal t -> Value) -> (a -> XVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> XVal t
forall t a. Aes t a -> a -> XVal t
_x Aes t a
a) [a]
xs
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.y ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (YVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (YVal t -> Value) -> (a -> YVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> YVal t
forall t a. Aes t a -> a -> YVal t
_y Aes t a
a) [a]
xs
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Mode] -> Identity (Maybe [Mode]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Mode])
Plot.mode ((Maybe [Mode] -> Identity (Maybe [Mode]))
 -> Trace -> Identity Trace)
-> [Mode] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ [Mode
Plot.Lines]

-- | Render an Aes (styling header) <a> and data <xs> into a `Plot.Trace box`
-- e.g. `hbox myAes [1,1,4,5,6,9,9]`
--
hbox  :: (AxisValue (XVal t), Num (XVal t))
      => Aes t a
      -> [a]
      -> Plot.Trace
hbox :: forall t a.
(AxisValue (XVal t), Num (XVal t)) =>
Aes t a -> [a] -> Trace
hbox Aes t a
a [a]
xs = Trace
Plot.box
          Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.x    ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (XVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (XVal t -> Value) -> (a -> XVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> XVal t
forall t a. Aes t a -> a -> XVal t
_x Aes t a
a) [a]
xs
          Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Mode] -> Identity (Maybe [Mode]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Mode])
Plot.mode ((Maybe [Mode] -> Identity (Maybe [Mode]))
 -> Trace -> Identity Trace)
-> [Mode] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ [Mode
Plot.Lines]

-- | Render an Aes (styling header) <a> and data <ys> into a `Plot.Trace box`
-- e.g. `vbox myAes [1,1,4,5,6,9,9]`
--
vbox  :: (AxisValue (YVal t), Num (YVal t))
      => Aes t a
      -> [a]
      -> Plot.Trace
vbox :: forall t a.
(AxisValue (YVal t), Num (YVal t)) =>
Aes t a -> [a] -> Trace
vbox Aes t a
a [a]
ys = Trace
Plot.box
          Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.y    ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (YVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (YVal t -> Value) -> (a -> YVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> YVal t
forall t a. Aes t a -> a -> YVal t
_y Aes t a
a) [a]
ys
          Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Mode] -> Identity (Maybe [Mode]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Mode])
Plot.mode ((Maybe [Mode] -> Identity (Maybe [Mode]))
 -> Trace -> Identity Trace)
-> [Mode] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ [Mode
Plot.Lines]

hbars :: (AxisValue (XVal t), AxisValue (YVal t))
       => Aes t a -> [a] -> Plot.Trace
hbars :: forall t a.
(AxisValue (XVal t), AxisValue (YVal t)) =>
Aes t a -> [a] -> Trace
hbars Aes t a
a [a]
xs = Trace
Plot.bars Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.x ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (XVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (XVal t -> Value) -> (a -> XVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> XVal t
forall t a. Aes t a -> a -> XVal t
_x Aes t a
a) [a]
xs
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.y ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (YVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (YVal t -> Value) -> (a -> YVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> YVal t
forall t a. Aes t a -> a -> YVal t
_y Aes t a
a) [a]
xs
                 Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe Orientation -> Identity (Maybe Orientation))
-> Trace -> Identity Trace
Lens' Trace (Maybe Orientation)
Plot.orientation ((Maybe Orientation -> Identity (Maybe Orientation))
 -> Trace -> Identity Trace)
-> Orientation -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Orientation
Plot.Horizontal

hcontour :: (AxisValue (XVal t), AxisValue (YVal t), AxisValue (ZVal t))
         => Aes t a -> [a] -> Plot.Trace
hcontour :: forall t a.
(AxisValue (XVal t), AxisValue (YVal t), AxisValue (ZVal t)) =>
Aes t a -> [a] -> Trace
hcontour Aes t a
a [a]
xs = Trace
Plot.contour
                Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.x ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (XVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (XVal t -> Value) -> (a -> XVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> XVal t
forall t a. Aes t a -> a -> XVal t
_x Aes t a
a) [a]
xs
                Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.y ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (YVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (YVal t -> Value) -> (a -> YVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> YVal t
forall t a. Aes t a -> a -> YVal t
_y Aes t a
a) [a]
xs
                Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe [Value] -> Identity (Maybe [Value]))
-> Trace -> Identity Trace
Lens' Trace (Maybe [Value])
Plot.z ((Maybe [Value] -> Identity (Maybe [Value]))
 -> Trace -> Identity Trace)
-> [Value] -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (a -> Value) -> [a] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map (ZVal t -> Value
forall a. ToJSON a => a -> Value
toJSON (ZVal t -> Value) -> (a -> ZVal t) -> a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Aes t a -> a -> ZVal t
forall t a. Aes t a -> a -> ZVal t
_z Aes t a
a) [a]
xs
                Trace -> (Trace -> Trace) -> Trace
forall a b. a -> (a -> b) -> b
& (Maybe Orientation -> Identity (Maybe Orientation))
-> Trace -> Identity Trace
Lens' Trace (Maybe Orientation)
Plot.orientation ((Maybe Orientation -> Identity (Maybe Orientation))
 -> Trace -> Identity Trace)
-> Orientation -> Trace -> Trace
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Orientation
Plot.Horizontal