pipes-key-value-csv-0.2.0.0: src/Pipes/KeyValueCsv/Cell.hs
{-|
Module : Pipes.KeyValueCsv.Cell
Copyright : (c) Marcin Mrotek, 2015
License : BSD3
Maintainer : marcin.jan.mrotek@gmail.com
Stability : experimental
Automated parsing of single cells.
-}
{-# LANGUAGE
FlexibleContexts
, FlexibleInstances
, GeneralizedNewtypeDeriving
, PolyKinds
, RankNTypes
, TypeSynonymInstances
#-}
module Pipes.KeyValueCsv.Cell where
import Pipes.KeyValueCsv.Internal
import Data.Text (Text)
import qualified Data.Text.Lazy as Lazy
import Data.Text.Lazy.Read
import Data.Vinyl.Functor
import Pipes.Parse (Parser)
import Pipes.Parse.Tutorial()
-- |Parse a single cell. For more information about parsing with Pipes, see "Pipes.Parse.Tutorial".
class FromCell c where
fromCell :: Monad m => Parser Text m (Either String c)
instance FromCell Text where
fromCell = Right . Lazy.toStrict <$> drawText
instance FromCell String where
fromCell = Right . Lazy.unpack <$> drawText
instance FromCell Integer where
fromCell = fmap fst . signed decimal <$> (skipSpace >> build)
instance FromCell Int where
fromCell = fmap fst . signed decimal <$> (skipSpace >> build)
instance FromCell Double where
fromCell = fmap fst . double <$> (skipSpace >> build)
instance FromCell a => FromCell (Identity a) where
fromCell = fmap Identity <$> fromCell
instance FromCell (f (g a)) => FromCell (Compose f g a) where
fromCell = fmap Compose <$> fromCell
instance FromCell a => FromCell (Thunk a) where
fromCell = fmap Thunk <$> fromCell