{-# LANGUAGE TypeOperators, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses #-}

module Database.HDBC.Tuple where

import Database.HDBC
import Data.Typical
import Data.Convertible

instance Convertible HNil [SqlValue] where
	safeConvert HNil = Right []

instance Convertible [SqlValue] HNil where
	safeConvert [] = Right HNil
	safeConvert _ = Left (ConvertError "[..]" "[SqlValue]" "HNil" "source list too long.")

instance (Convertible a SqlValue, Convertible b [SqlValue]) => Convertible (a :#: b) [SqlValue] where
	safeConvert (a :#: b) = Right (convert a : convert b)

instance (Convertible SqlValue a, Convertible [SqlValue] b) => Convertible [SqlValue] (a :#: b) where
	safeConvert (a:b) = Right (convert a :#: convert b)
	safeConvert [] = Left (ConvertError "[]" "[Sqlvalue]" "a :#: b" "source list too short")