packages feed

composite-cassava-0.0.2.0: src/Composite/Csv.hs

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