{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
module Charts.Internal.Auto where
import Charts.Internal.Chart
import Generics.OneLiner
import Data.Aeson
import Data.Proxy
import qualified Data.Text as T
import Data.Scientific
class ChartColumn a where
columnHeader :: Proxy a -> Column
instance ChartColumn Int where
columnHeader :: Proxy Int -> Column
columnHeader Proxy Int
_ = Text -> Column
NumberColumn Text
""
instance ChartColumn Float where
columnHeader :: Proxy Float -> Column
columnHeader Proxy Float
_ = Text -> Column
NumberColumn Text
""
instance ChartColumn Double where
columnHeader :: Proxy Double -> Column
columnHeader Proxy Double
_ = Text -> Column
NumberColumn Text
""
instance ChartColumn Scientific where
columnHeader :: Proxy Scientific -> Column
columnHeader Proxy Scientific
_ = Text -> Column
NumberColumn Text
""
instance ChartColumn T.Text where
columnHeader :: Proxy Text -> Column
columnHeader Proxy Text
_ = Text -> Column
StringColumn Text
""
instance ChartColumn String where
columnHeader :: Proxy String -> Column
columnHeader Proxy String
_ = Text -> Column
StringColumn Text
""
instance ChartColumn Bool where
columnHeader :: Proxy Bool -> Column
columnHeader Proxy Bool
_ = Text -> Column
BoolColumn Text
""
type ChartRowAuto a = (ADT a, Constraints a ToJSON)
type a = (Constraints a ChartColumn)
autoChart :: forall row. (ChartRowHeaderAuto row, ChartRowAuto row) => ChartOptions -> ChartStyle -> [row] -> Chart
autoChart :: ChartOptions -> ChartStyle -> [row] -> Chart
autoChart ChartOptions
opts ChartStyle
styl xs :: [row]
xs@[] = ChartOptions -> ChartStyle -> [Column] -> [row] -> Chart
forall row.
ChartRowAuto row =>
ChartOptions -> ChartStyle -> [Column] -> [row] -> Chart
autoChartWithHeaders ChartOptions
opts ChartStyle
styl [] [row]
xs
autoChart ChartOptions
opts ChartStyle
styl (row
x:[row]
xs) = ChartOptions -> ChartStyle -> [Column] -> [row] -> Chart
forall row.
ChartRowAuto row =>
ChartOptions -> ChartStyle -> [Column] -> [row] -> Chart
autoChartWithHeaders ChartOptions
opts ChartStyle
styl [Column]
cols (row
xrow -> [row] -> [row]
forall a. a -> [a] -> [a]
:[row]
xs)
where
cols :: [Column]
cols :: [Column]
cols = (forall s. ChartColumn s => s -> [Column]) -> row -> [Column]
forall (c :: * -> Constraint) t m.
(ADT t, Constraints t c, Monoid m) =>
(forall s. c s => s -> m) -> t -> m
gfoldMap @ChartColumn forall s. ChartColumn s => s -> [Column]
toColumn row
x
toColumn :: forall a. ChartColumn a => a -> [Column]
toColumn :: a -> [Column]
toColumn a
_ = [Proxy a -> Column
forall a. ChartColumn a => Proxy a -> Column
columnHeader (Proxy a
forall k (t :: k). Proxy t
Proxy @a)]
autoChartWithHeaders :: forall row. (ChartRowAuto row) => ChartOptions -> ChartStyle -> [Column] -> [row] -> Chart
ChartOptions
opts ChartStyle
styl [Column]
cols [] = ChartOptions -> ChartStyle -> [Column] -> [[Value]] -> Chart
buildChart ChartOptions
opts ChartStyle
styl [Column]
cols []
autoChartWithHeaders ChartOptions
opts ChartStyle
styl [Column]
cols (row
x:[row]
xs) = ChartOptions -> ChartStyle -> [Column] -> [[Value]] -> Chart
buildChart ChartOptions
opts ChartStyle
styl [Column]
cols [[Value]]
rows
where
rows :: [[Value]]
rows :: [[Value]]
rows = row -> [Value]
rowToJSON (row -> [Value]) -> [row] -> [[Value]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (row
xrow -> [row] -> [row]
forall a. a -> [a] -> [a]
:[row]
xs)
rowToJSON :: row -> [Value]
rowToJSON :: row -> [Value]
rowToJSON row
row = (forall s. ToJSON s => s -> [Value]) -> row -> [Value]
forall (c :: * -> Constraint) t m.
(ADT t, Constraints t c, Monoid m) =>
(forall s. c s => s -> m) -> t -> m
gfoldMap @ToJSON forall s. ToJSON s => s -> [Value]
singleToRow row
row
singleToRow :: forall a. ToJSON a => a -> [Value]
singleToRow :: a -> [Value]
singleToRow = (Value -> [Value] -> [Value]
forall a. a -> [a] -> [a]
:[]) (Value -> [Value]) -> (a -> Value) -> a -> [Value]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Value
forall a. ToJSON a => a -> Value
toJSON