{-# LINE 1 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Graphics.Cairo.Surfaces.CairoWriteFuncT where

import Foreign.Ptr
import Foreign.C.Types
import Foreign.C.String
import Control.Monad.Primitive
import Data.Word

import qualified Data.Text as T
import qualified Data.Text.Foreign as T

import qualified Data.ByteString as BS



data WriteResult = WriteFailure | WriteSuccess deriving Int -> WriteResult -> ShowS
[WriteResult] -> ShowS
WriteResult -> String
(Int -> WriteResult -> ShowS)
-> (WriteResult -> String)
-> ([WriteResult] -> ShowS)
-> Show WriteResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WriteResult -> ShowS
showsPrec :: Int -> WriteResult -> ShowS
$cshow :: WriteResult -> String
show :: WriteResult -> String
$cshowList :: [WriteResult] -> ShowS
showList :: [WriteResult] -> ShowS
Show

writeResultToCairoStatusT :: WriteResult -> Word32
{-# LINE 22 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
writeResultToCairoStatusT = \case
	WriteFailure -> 11
{-# LINE 24 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
	WriteSuccess -> 0
{-# LINE 25 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}

foreign import ccall "wrapper" c_wrap_cairo_write_func_t ::
	(Ptr a -> CString -> CInt -> IO Word32) ->
{-# LINE 28 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
	IO (FunPtr (Ptr a -> CString -> CInt -> IO Word32))
{-# LINE 29 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}

wrapCairoWriteFuncTText :: PrimBase m => (Ptr a -> T.Text -> m WriteResult) ->
	IO (FunPtr (Ptr a -> CString -> CInt -> IO Word32))
{-# LINE 32 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
wrapCairoWriteFuncTText wf = c_wrap_cairo_write_func_t $ convertCairoWriteFuncTText wf

wrapCairoWriteFuncTByteString :: PrimBase m => (Ptr a -> BS.ByteString -> m WriteResult) ->
	IO (FunPtr (Ptr a -> CString -> CInt -> IO Word32))
{-# LINE 36 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
wrapCairoWriteFuncTByteString = c_wrap_cairo_write_func_t . convertCairoWriteFuncTByteString

convertCairoWriteFuncT :: (Ptr a -> String -> IO Word32) ->
{-# LINE 39 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
	Ptr a -> CString -> CInt -> IO Word32
{-# LINE 40 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
convertCairoWriteFuncT wf p cs ln = peekCStringLen (cs, fromIntegral ln) >>= \s -> wf p s

convertCairoWriteFuncTText :: PrimBase m => (Ptr a -> T.Text -> m WriteResult) ->
	Ptr a -> CString -> CInt -> IO Word32
{-# LINE 44 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
convertCairoWriteFuncTText wf p cs ln = writeResultToCairoStatusT
	<$> (T.peekCStringLen (cs, fromIntegral ln) >>= \t -> unsafePrimToIO $ wf p t)

convertCairoWriteFuncTByteString :: PrimBase m => (Ptr a -> BS.ByteString -> m WriteResult) ->
	Ptr a -> CString -> CInt -> IO Word32
{-# LINE 49 "src/Graphics/Cairo/Surfaces/CairoWriteFuncT.hsc" #-}
convertCairoWriteFuncTByteString wf p cs ln = writeResultToCairoStatusT
	<$> (BS.packCStringLen (cs, fromIntegral ln) >>= \bs -> unsafePrimToIO $ wf p bs)