module Data.Csv.IxSet.Typed (decodeByName, encodeByName) where

import Data.ByteString.Lazy
import qualified Data.Csv
import Data.IxSet.Typed as Ix
import Data.Vector as V

-- Like `Data.Csv.decodeByName` but for `IxSet`.
--
-- @since 0.0.2.0
decodeByName :: (Ix.Indexable ixs xs, Data.Csv.FromNamedRecord xs) => ByteString -> Either String (Data.Csv.Header, Ix.IxSet ixs xs)
decodeByName :: ByteString -> Either String (Header, IxSet ixs xs)
decodeByName = ((Header, Vector xs) -> (Header, IxSet ixs xs))
-> Either String (Header, Vector xs)
-> Either String (Header, IxSet ixs xs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Vector xs -> IxSet ixs xs)
-> (Header, Vector xs) -> (Header, IxSet ixs xs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([xs] -> IxSet ixs xs
forall (ixs :: [*]) a. Indexable ixs a => [a] -> IxSet ixs a
Ix.fromList ([xs] -> IxSet ixs xs)
-> (Vector xs -> [xs]) -> Vector xs -> IxSet ixs xs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector xs -> [xs]
forall a. Vector a -> [a]
V.toList)) (Either String (Header, Vector xs)
 -> Either String (Header, IxSet ixs xs))
-> (ByteString -> Either String (Header, Vector xs))
-> ByteString
-> Either String (Header, IxSet ixs xs)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String (Header, Vector xs)
forall a.
FromNamedRecord a =>
ByteString -> Either String (Header, Vector a)
Data.Csv.decodeByName

-- Like `Data.Csv.encodeByName` but for `IxSet`.
--
-- @since 0.0.2.0
encodeByName :: (Ix.Indexable ixs xs, Data.Csv.ToNamedRecord xs) => Data.Csv.Header -> Ix.IxSet ixs xs -> ByteString
encodeByName :: Header -> IxSet ixs xs -> ByteString
encodeByName Header
h = Header -> [xs] -> ByteString
forall a. ToNamedRecord a => Header -> [a] -> ByteString
Data.Csv.encodeByName Header
h ([xs] -> ByteString)
-> (IxSet ixs xs -> [xs]) -> IxSet ixs xs -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs xs -> [xs]
forall (ixs :: [*]) a. IxSet ixs a -> [a]
Ix.toList