{-# 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 _ = Text -> Column
NumberColumn ""
instance ChartColumn Float where
columnHeader :: Proxy Float -> Column
columnHeader _ = Text -> Column
NumberColumn ""
instance ChartColumn Double where
columnHeader :: Proxy Double -> Column
columnHeader _ = Text -> Column
NumberColumn ""
instance ChartColumn Scientific where
columnHeader :: Proxy Scientific -> Column
columnHeader _ = Text -> Column
NumberColumn ""
instance ChartColumn T.Text where
columnHeader :: Proxy Text -> Column
columnHeader _ = Text -> Column
StringColumn ""
instance ChartColumn String where
columnHeader :: Proxy String -> Column
columnHeader _ = Text -> Column
StringColumn ""
instance ChartColumn Bool where
columnHeader :: Proxy Bool -> Column
columnHeader _ = Text -> Column
BoolColumn ""
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 opts :: ChartOptions
opts styl :: 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 opts :: ChartOptions
opts styl :: ChartStyle
styl (x :: row
x:xs :: [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 _ = [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
opts :: ChartOptions
opts styl :: ChartStyle
styl cols :: [Column]
cols [] = ChartOptions -> ChartStyle -> [Column] -> [[Value]] -> Chart
buildChart ChartOptions
opts ChartStyle
styl [Column]
cols []
autoChartWithHeaders opts :: ChartOptions
opts styl :: ChartStyle
styl cols :: [Column]
cols (x :: row
x:xs :: [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
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