{-# LANGUAGE OverloadedStrings #-}
module DataFrame
  ( module D,
    (|>),
    printSessionSchema
  )
where

import DataFrame.Internal.Types as D
import DataFrame.Internal.Expression as D
import DataFrame.Internal.Parsing as D
import DataFrame.Internal.Column as D
import DataFrame.Internal.DataFrame as D hiding (columnIndices, columns)
import DataFrame.Internal.Row as D hiding (mkRowRep)
import DataFrame.Errors as D
import DataFrame.Operations.Core as D
import DataFrame.Operations.Merge as D
import DataFrame.Operations.Join as D
import DataFrame.Operations.Subset as D
import DataFrame.Operations.Sorting as D
import DataFrame.Operations.Statistics as D
import DataFrame.Operations.Transformations as D
import DataFrame.Operations.Typing as D
import DataFrame.Operations.Aggregation as D
import DataFrame.Display.Terminal.Plot as D
import DataFrame.IO.CSV as D

import Data.Function
import Data.List
import qualified Data.Text as T
import qualified Data.Text.IO as T

|> :: a -> (a -> b) -> b
(|>) = a -> (a -> b) -> b
forall a b. a -> (a -> b) -> b
(&)

printSessionSchema :: D.DataFrame -> IO ()
printSessionSchema :: DataFrame -> IO ()
printSessionSchema DataFrame
df = Text -> IO ()
T.putStrLn (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ let
    ([Text]
lhs, [Text]
rhs) = (Text -> ([Text], [Text]) -> ([Text], [Text]))
-> ([Text], [Text]) -> [Text] -> ([Text], [Text])
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Text -> ([Text], [Text]) -> ([Text], [Text])
go ([], []) (DataFrame -> [Text]
D.columnNames DataFrame
df)
    columnRep :: Text -> Text
columnRep Text
name = let
        colType :: Text
colType = String -> Text
T.pack (Column -> String
D.columnTypeString (Text -> DataFrame -> Column
D.unsafeGetColumn Text
name DataFrame
df))
      in Text
"F.col @(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
colType Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
") \"" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\""
    go :: Text -> ([Text], [Text]) -> ([Text], [Text])
go Text
name ([Text]
l, [Text]
r) = (Text -> Text
T.toLower Text
nameText -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:[Text]
l, Text -> Text
columnRep Text
nameText -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:[Text]
r)
  in [Text] -> Text
T.unlines [Text
":{", Text
"{-# LANGUAGE TypeApplications #-}",
                Text
"import qualified DataFrame.Functions as F",
                Text
"import Data.Text (Text)",
                Text
"(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> [Text] -> Text
T.intercalate Text
"," [Text]
lhs Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" = " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> [Text] -> Text
T.intercalate Text
"," [Text]
rhs Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")",
                Text
":}"]