module Database.Groundhog.Generic.Sql.Utf8
    ( module Database.Groundhog.Generic.Sql
    , Utf8 (..)
    , fromUtf8
    ) where

import Database.Groundhog.Core
import Database.Groundhog.Generic.Sql
import Blaze.ByteString.Builder
import qualified Blaze.ByteString.Builder.Char.Utf8 as B
import Data.ByteString
import Data.Monoid
import Data.String

newtype Utf8 = Utf8 Builder

fromUtf8 :: Utf8 -> ByteString
fromUtf8 (Utf8 a) = toByteString a

instance Monoid Utf8 where
  mempty = Utf8 mempty
  mappend (Utf8 a) (Utf8 b) = Utf8 (mappend a b)

instance IsString Utf8 where
  fromString = Utf8 . B.fromString

instance StringLike Utf8 where
  fromChar = Utf8 . B.fromChar

{-# SPECIALIZE (<>) :: RenderS Utf8 -> RenderS Utf8 -> RenderS Utf8 #-}

{-# SPECIALIZE renderArith :: (PersistEntity v, Constructor c, DbDescriptor db) => Proxy db -> (Utf8 -> Utf8) -> Arith v c a -> RenderS Utf8 #-}

{-# SPECIALIZE renderCond :: (PersistEntity v, Constructor c, DbDescriptor db)
  => Proxy db
  -> (Utf8 -> Utf8)
  -> (Utf8 -> Utf8 -> Utf8)
  -> (Utf8 -> Utf8 -> Utf8)
  -> Cond v c -> Maybe (RenderS Utf8) #-}

{-# SPECIALIZE renderOrders :: (PersistEntity v, Constructor c) => (Utf8 -> Utf8) -> [Order v c] -> Utf8 #-}

{-# SPECIALIZE renderUpdates :: (PersistEntity v, Constructor c, DbDescriptor db) => Proxy db -> (Utf8 -> Utf8) -> [Update v c] -> Maybe (RenderS Utf8) #-}

{-# SPECIALIZE renderFields :: (Utf8 -> Utf8) -> [(String, DbType)] -> Utf8 #-}

{-# SPECIALIZE renderChain :: (Utf8 -> Utf8) -> FieldChain -> [Utf8] -> [Utf8] #-}