add unStr,unInt and unFloat in the Haskell binding

This commit is contained in:
krasimir
2017-01-26 06:40:13 +00:00
parent 00f15826af
commit 4442e302e6
3 changed files with 34 additions and 1 deletions

View File

@@ -30,7 +30,7 @@ module PGF2 (-- * PGF
-- ** Functions
Fun,functions, functionsByCat, functionType, hasLinearization,
-- ** Expressions
Expr,showExpr,readExpr,mkApp,unApp,mkStr,mkInt,mkFloat,
Expr,showExpr,readExpr,mkApp,unApp,mkStr,unStr,mkInt,unInt,mkFloat,unFloat,
-- ** Types
Type(..), Hypo, BindType(..), showType,

View File

@@ -73,6 +73,16 @@ mkStr str =
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
return (Expr c_expr exprFPl)
-- | Decomposes an expression into a string literal
unStr :: Expr -> Maybe String
unStr (Expr expr master) =
unsafePerformIO $ do
plit <- pgf_expr_unlit expr (#const PGF_LITERAL_STR)
if plit == nullPtr
then return Nothing
else do s <- peekUtf8CString (plit `plusPtr` (#offset PgfLiteralStr, val))
return (Just s)
-- | Constructs an expression from an integer literal
mkInt :: Int -> Expr
mkInt val =
@@ -82,6 +92,16 @@ mkInt val =
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
return (Expr c_expr exprFPl)
-- | Decomposes an expression into an integer literal
unInt :: Expr -> Maybe Int
unInt (Expr expr master) =
unsafePerformIO $ do
plit <- pgf_expr_unlit expr (#const PGF_LITERAL_INT)
if plit == nullPtr
then return Nothing
else do n <- peek (plit `plusPtr` (#offset PgfLiteralInt, val))
return (Just (fromIntegral (n :: CInt)))
-- | Constructs an expression from a real number
mkFloat :: Double -> Expr
mkFloat val =
@@ -91,6 +111,16 @@ mkFloat val =
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
return (Expr c_expr exprFPl)
-- | Decomposes an expression into a real number literal
unFloat :: Expr -> Maybe Double
unFloat (Expr expr master) =
unsafePerformIO $ do
plit <- pgf_expr_unlit expr (#const PGF_LITERAL_FLT)
if plit == nullPtr
then return Nothing
else do n <- peek (plit `plusPtr` (#offset PgfLiteralFlt, val))
return (Just (realToFrac (n :: CDouble)))
-- | parses a 'String' as an expression
readExpr :: String -> Maybe Expr
readExpr str =

View File

@@ -266,6 +266,9 @@ foreign import ccall "pgf/pgf.h pgf_expr_int"
foreign import ccall "pgf/pgf.h pgf_expr_float"
pgf_expr_float :: CDouble -> Ptr GuPool -> IO PgfExpr
foreign import ccall "pgf/pgf.h pgf_expr_unlit"
pgf_expr_unlit :: PgfExpr -> CInt -> IO (Ptr a)
foreign import ccall "pgf/pgf.h pgf_expr_unapply"
pgf_expr_unapply :: PgfExpr -> Ptr GuPool -> IO (Ptr PgfApplication)