llvm-general-0.1: src/LLVM/General/Internal/String.hs
{-# LANGUAGE
MultiParamTypeClasses,
FlexibleInstances,
UndecidableInstances
#-}
module LLVM.General.Internal.String where
import Control.Arrow
import Control.Monad
import Foreign.C (CString, CChar)
import Foreign.Ptr
import Control.Monad.AnyCont
import Control.Monad.IO.Class
import LLVM.General.Internal.Coding
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
instance (MonadAnyCont IO e) => EncodeM e String CString where
encodeM s = anyContToM (BS.useAsCString . T.encodeUtf8 . T.pack $ s)
instance (Integral i, MonadAnyCont IO e) => EncodeM e String (Ptr CChar, i) where
encodeM s = anyContToM ((. (. second fromIntegral)) . BS.useAsCStringLen . T.encodeUtf8 . T.pack $ s)
instance (MonadIO d) => DecodeM d String CString where
decodeM = liftIO . liftM (T.unpack . T.decodeUtf8) . BS.packCString
instance (Integral i, MonadIO d) => DecodeM d String (Ptr CChar, i) where
decodeM = liftIO . liftM (T.unpack . T.decodeUtf8) . BS.packCStringLen . second fromIntegral