{-# 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)