{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Composite.Csv where
import Composite.Record
import Data.Csv
import Data.HashMap.Strict as HM
import Data.Text.Encoding as T
import GHC.TypeLits
instance FromNamedRecord (Rec f '[]) where
parseNamedRecord m = pure RNil
instance ToNamedRecord (Rec f '[]) where
toNamedRecord m = mempty
instance (Functor f, KnownSymbol s, FromField (f x), FromNamedRecord (Rec f xs)) => FromNamedRecord (Rec f ((s :-> x) ': xs)) where
parseNamedRecord m = do
let nL :: (s :-> x)
nL = undefined
x <- m .: T.encodeUtf8 (valName nL)
f <- parseNamedRecord @(Rec f xs) m
pure $ x :^: f
instance (Functor f, KnownSymbol s, ToField (f x), ToNamedRecord (Rec f xs)) => ToNamedRecord (Rec f ((s :-> x) ': xs)) where
toNamedRecord (x :^: xs) =
let nL :: (s :-> x)
nL = undefined
in HM.singleton (T.encodeUtf8 (valName nL)) (toField x) <> toNamedRecord xs