module Foreign.Hoppy.Generator.Std.String (c_string) where
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid (mconcat)
#endif
import Foreign.Hoppy.Generator.Language.Haskell (addImports, sayLn)
import Foreign.Hoppy.Generator.Spec
import Foreign.Hoppy.Generator.Types
import Language.Haskell.Syntax (
HsName (HsIdent),
HsQName (UnQual),
HsType (HsTyCon),
)
c_string :: Class
c_string =
addReqIncludes [includeStd "string"] $
classAddFeatures [Assignable, Comparable, Copyable, Equatable] $
classSetHaskellConversion
ClassHaskellConversion
{ classHaskellConversionType = Just $ do
addImports hsImportForPrelude
return $ HsTyCon $ UnQual $ HsIdent "HoppyP.String"
, classHaskellConversionToCppFn = Just $ do
addImports $ mconcat [hsImportForPrelude, hsImportForForeignC]
sayLn "HoppyP.flip HoppyFC.withCString stdString_newFromCString"
, classHaskellConversionFromCppFn = Just $ do
addImports $ mconcat [hsImport1 "Control.Monad" "(<=<)", hsImportForForeignC]
sayLn "HoppyFC.peekCString <=< stdString_c_str"
} $
makeClass (ident1 "std" "string") (Just $ toExtName "StdString") []
[ mkCtor "new" []
, mkCtor "newFromCString" [ptrT $ constT charT]
, mkConstMethod' "at" "at" [intT] $ refT charT
, mkConstMethod' "at" "get" [intT] charT
, mkConstMethod "c_str" [] $ ptrT $ constT charT
, mkConstMethod "size" [] sizeT
]