Skip to content

Instantly share code, notes, and snippets.

@bgamari
Last active August 29, 2015 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bgamari/efad8560ab7dd38e9407 to your computer and use it in GitHub Desktop.
Save bgamari/efad8560ab7dd38e9407 to your computer and use it in GitHub Desktop.
{-# LANGUAGE TemplateHaskell #-}
import StaticCSV
import Data.Proxy
myData = $(staticCSV "my-data.csv" (Proxy :: Proxy (Int, String)))
main = print myData
5 hi
6 hello
7 hmm
{-# LANGUAGE TemplateHaskell, FlexibleContexts #-}
module StaticCSV (staticCSV) where
import Control.Applicative
import Data.Csv as Csv hiding (Name)
import Data.Proxy
import Data.Data
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (Lift, lift)
import qualified Data.ByteString.Lazy as BSL
import qualified Data.Vector as V
staticCSV :: (FromRecord a, Lift (V.Vector a)) => FilePath -> Proxy a -> ExpQ
staticCSV fileName ty = do
contents <- runIO $ BSL.readFile fileName
csv <- case decode NoHeader contents of
Right a -> return $ fmap (flip asProxyTypeOf ty) a
Left err -> fail err
lift csv
instance Lift a => Lift (V.Vector a) where
lift v = do
list <- ListE <$> mapM lift (V.toList v)
return $ AppE (VarE 'V.fromList) list
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment