{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module DataFrame.Typed.Types (
TypedDataFrame (..),
TExpr (..),
AsTExpr,
ToTExpr (..),
TSortOrder (..),
TypedGrouped (..),
TAgg (..),
taggToNamedExprs,
These (..),
) where
import Data.Kind (Type)
import GHC.TypeLits (Symbol)
import qualified Data.Text as T
import DataFrame.Internal.Column (Columnable)
import qualified DataFrame.Internal.DataFrame as D
import DataFrame.Internal.Expression (Expr, NamedExpr, UExpr (..))
import DataFrame.Internal.Types (These (..))
newtype TypedDataFrame (cols :: [(Symbol, Type)]) = TDF {forall (cols :: [(Symbol, *)]). TypedDataFrame cols -> DataFrame
unTDF :: D.DataFrame}
instance Show (TypedDataFrame cols) where
show :: TypedDataFrame cols -> String
show (TDF DataFrame
df) = DataFrame -> String
forall a. Show a => a -> String
show DataFrame
df
instance Eq (TypedDataFrame cols) where
(TDF DataFrame
a) == :: TypedDataFrame cols -> TypedDataFrame cols -> Bool
== (TDF DataFrame
b) = DataFrame
a DataFrame -> DataFrame -> Bool
forall a. Eq a => a -> a -> Bool
== DataFrame
b
newtype TExpr (cols :: [(Symbol, Type)]) a = TExpr {forall (cols :: [(Symbol, *)]) a. TExpr cols a -> Expr a
unTExpr :: Expr a}
instance (Show a) => Show (TExpr cols a) where
showsPrec :: Int -> TExpr cols a -> ShowS
showsPrec Int
d (TExpr Expr a
e) = Int -> Expr a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
d Expr a
e
type family AsTExpr (cols :: [(Symbol, Type)]) (e :: Type) :: Type where
AsTExpr cols (Expr r) = TExpr cols r
class ToTExpr (cols :: [(Symbol, Type)]) e where
toTExpr :: e -> AsTExpr cols e
instance ToTExpr cols (Expr r) where
toTExpr :: Expr r -> AsTExpr cols (Expr r)
toTExpr = Expr r -> AsTExpr cols (Expr r)
Expr r -> TExpr cols r
forall (cols :: [(Symbol, *)]) a. Expr a -> TExpr cols a
TExpr
data TSortOrder (cols :: [(Symbol, Type)]) where
Asc :: (Columnable a, Ord a) => TExpr cols a -> TSortOrder cols
Desc :: (Columnable a, Ord a) => TExpr cols a -> TSortOrder cols
newtype TypedGrouped (keys :: [Symbol]) (cols :: [(Symbol, Type)])
= TGD {forall (keys :: [Symbol]) (cols :: [(Symbol, *)]).
TypedGrouped keys cols -> GroupedDataFrame
unTGD :: D.GroupedDataFrame}
data TAgg (keys :: [Symbol]) (cols :: [(Symbol, Type)]) (aggs :: [(Symbol, Type)]) where
TAggNil :: TAgg keys cols '[]
TAggCons ::
(Columnable a) =>
T.Text ->
TExpr cols a ->
TAgg keys cols aggs ->
TAgg keys cols ('(name, a) ': aggs)
taggToNamedExprs :: TAgg keys cols aggs -> [NamedExpr]
taggToNamedExprs :: forall (keys :: [Symbol]) (cols :: [(Symbol, *)])
(aggs :: [(Symbol, *)]).
TAgg keys cols aggs -> [NamedExpr]
taggToNamedExprs = [NamedExpr] -> [NamedExpr]
forall a. [a] -> [a]
reverse ([NamedExpr] -> [NamedExpr])
-> (TAgg keys cols aggs -> [NamedExpr])
-> TAgg keys cols aggs
-> [NamedExpr]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TAgg keys cols aggs -> [NamedExpr]
forall (keys :: [Symbol]) (cols :: [(Symbol, *)])
(aggs :: [(Symbol, *)]).
TAgg keys cols aggs -> [NamedExpr]
go
where
go :: TAgg keys cols aggs -> [NamedExpr]
go :: forall (keys :: [Symbol]) (cols :: [(Symbol, *)])
(aggs :: [(Symbol, *)]).
TAgg keys cols aggs -> [NamedExpr]
go TAgg keys cols aggs
TAggNil = []
go (TAggCons Text
name (TExpr Expr a
expr) TAgg keys cols aggs
rest) = (Text
name, Expr a -> UExpr
forall a. Columnable a => Expr a -> UExpr
UExpr Expr a
expr) NamedExpr -> [NamedExpr] -> [NamedExpr]
forall a. a -> [a] -> [a]
: TAgg keys cols aggs -> [NamedExpr]
forall (keys :: [Symbol]) (cols :: [(Symbol, *)])
(aggs :: [(Symbol, *)]).
TAgg keys cols aggs -> [NamedExpr]
go TAgg keys cols aggs
rest